michaelforney / oscmix

Mixer for RME Fireface UCX II
Other
19 stars 4 forks source link

Fireface 802 support #4

Open michaelforney opened 6 months ago

michaelforney commented 6 months ago

@huddx01 and sjzstudio on the RME forum have kindly provided CC-mode USB descriptors for the 802. It seems to be consistent with the UCX II, so hopefully shouldn't be too difficult to support.

My only concern is the vendor-specific interface with bulk endpoints.

sjzstudio also noted that when dumping from the second MIDI port, they saw

16:1 System exclusive F0 00 20 0D 10 00 00 12 00 78 0B F7

This seems to follow the same SysEx packet format: manufacturer ID 00 20 0Dh, device ID 10h, sub ID 00h indicating register change, and then a 5 byte payload 00 12 00 78 0B, which is 0x3f000900 after decoding. This means "register 0x3f00 set to 0x0900". On the UCX II, register 3F00 is only written from the host to the device and is used to get the device to tell us about any registers that changed, I didn't ever see it sent from the device to the host. So something is a bit different here.

My next question is does the 802 ever send any different messages, or is it always the same exact bytes F0 00 20 0D 10 00 00 12 00 78 0B F7?

huddx01 commented 6 months ago

yes, it does. I logged the sysex messages from the moment when turning on the ff802. In cc mode on a mac (with the drivers installed)... but it should not make a difference, as its in cc mode?

I was also wondering (longer time ago) that it delivers two MIDI IN/OUT Ports in cc mode. But in USB Mode, there is only one MIDI I/O Port. I thought, its because it has the ability to plug in the "old" and discontinued ARC Remote. I mean the 9 Pin Plug on the back.

ff802-cc-sysex_port2.txt

michaelforney commented 6 months ago

Thanks! Yes, it shouldn't make a difference what OS you capture from as long as you're in CC mode. I've decoded the log you provided below (in the first column, register, in the second column, value). These register numbers (3F00-3F05) aren't used in this direction on the UCX II, but I do see some similarities between these and the UCX II registers 3080-3082.

I don't know about the others.

So there are definitely some differences here, but enough similarities that I'm still optimistic. I'm going to write some small tool(s) so you can see the decoded packets easily and send some of your own. In particular, I think if you set 3F00 to cycling values (e.g. [3F00]=0000 encoded as F0 00 20 0D 10 00 00 00 00 78 0B F7, and [3F00]=0001 encoded as F0 00 20 0D 10 00 01 00 00 78 03 F7, the device might send you other registers).

3f00    0900
3f03    0000
3f02    00ff
3f00    0900
3f01    ffff
3f02    01ff
3f00    0900
3f03    0000
3f02    02ff
3f00    0900
3f01    ffff
3f02    03ff
3f04    b500
3f00    0900
3f03    0000
3f02    04ff
3f00    0900
3f01    ffff
3f02    05ff
3f00    0900
3f03    0000
3f02    06ff
3f00    0900
3f01    ffff
3f02    07ff
3f05    0000
3f00    0900
3f03    0000
3f02    08ff
3f00    0900
3f01    ffff
3f02    09ff
3f00    0900
3f03    0000
3f02    0aff
3f00    0900
3f01    ffff
3f02    0bff
3f00    0900
3f03    0000
3f02    0cff
3f00    0900
3f01    ffff
3f02    0dff
3f00    0900
3f03    0000
3f02    0eff
3f00    0900
3f01    ffff
3f02    0fff
3f00    0900
3f03    0000
3f02    10ff
3f00    0900
3f01    ffff
3f02    11ff
3f00    0900
3f03    0000
3f02    12ff
3f00    0900
3f01    ffff
3f02    13ff
3f04    b500
3f00    0900
3f03    0000
3f02    14ff
3f00    0900
3f01    ffff
3f02    15ff
3f00    0900
3f03    0000
3f02    16ff
3f00    0900
3f01    ffff
3f02    17ff
3f05    0000
3f00    0900
3f03    0000
3f02    18ff
3f00    0900
3f01    ffff
3f02    19ff
3f00    0900
3f03    0000
3f02    1aff
3f00    0900
3f01    ffff
3f02    1bff
3f00    0900
3f03    0000
3f02    1cff
3f00    0900
3f01    ffff
3f02    1dff
3f00    0900
3f03    0000
3f02    1eff
3f00    0900
3f01    ffff
3f02    1fff
3f00    0900
<repeating 3f00 0900>
huddx01 commented 6 months ago

Thanks for the explanation. Very interesting!

DSP Rev: 9 USB Rev: 20 Firewire Rev: 9 CC Rev: 12

I should mention, that i usually do not use linux for audio stuff. My debian is headless. No Window Manager. Just cli. But sure i could run Apps via x11. How would i set it best? I mean, as it is in CC Mode while plugged to debian, i have no possibility atm to control the DSP Effects... Ahh - via iPad... OK i have the TM App there. But how can i log the Sysex Data then? How did you connect it? You described that you logged it via wireshark (and your dissector) via a raspi. Yesterday, I tried the 3 lua scripts, they throw some errors. But i will look deeper into this later.

Maybe another hint, we can learn from: I played with the Aux. Devices in the TM Settings (Controlling a Octamic XTC). I do not own a Octamic, but: Enabled the Octamic ADAT 1-8 on virtual IACBus1 for I/O (Device ID 1) and similar ADAT 9-16 on IAC Bus 2 (Device ID 2).

This is the log:

0   From IAC Bus 1  SysEx       F0 00 20 0D 69 01 20 00 00 70 7F 01 00 70 7F 02 00 70 7F 03 00 70 7F 04 00 70 7F 05 00 70 7F 06 00 70 7F 07 00 70 7F F7
0   To IAC Bus 1    SysEx       F0 00 20 0D 69 01 20 00 00 70 7F 01 00 70 7F 02 00 70 7F 03 00 70 7F 04 00 70 7F 05 00 70 7F 06 00 70 7F 07 00 70 7F F7
0   From IAC Bus 2  SysEx       F0 00 20 0D 69 02 20 00 00 70 7F 01 00 70 7F 02 00 70 7F 03 00 70 7F 04 00 70 7F 05 00 70 7F 06 00 70 7F 07 00 70 7F F7
0   To IAC Bus 2    SysEx       F0 00 20 0D 69 02 20 00 00 70 7F 01 00 70 7F 02 00 70 7F 03 00 70 7F 04 00 70 7F 05 00 70 7F 06 00 70 7F 07 00 70 7F F7
0   From IAC Bus 1  SysEx       F0 00 20 0D 69 01 12 F7
0   To IAC Bus 1    SysEx       F0 00 20 0D 69 01 12 F7
0   From IAC Bus 2  SysEx       F0 00 20 0D 69 02 12 F7
0   To IAC Bus 2    SysEx       F0 00 20 0D 69 02 12 F7
...

If you look into the manual of the Octamic XTC, there is a detailed MIDI implementation description in the last chapter. Maybe it is similar to our interfaces?

michaelforney commented 6 months ago
  • Yes, I can confirm the DSP Revision:

DSP Rev: 9 USB Rev: 20 Firewire Rev: 9 CC Rev: 12

Nice, that makes me more confident that we're on the right track.

  • And sure, I can play around with the DSP Effects to see if the load is send via sysex.

I should mention, that i usually do not use linux for audio stuff.

I appreciate you helping out even though you don't use Linux for audio!

I've added a new tool at tools/regtool.c. It uses alsa-seq, so you'd need to be on your headless Debian for this. You can build it with make tools/regtool. It would be helpful if you could try the following

  1. Check that you see something like the log I showed above when you run ./tools/regtool XX:YY, where XX:YY is the alsa-seq port ID for the 802's second MIDI port. You can capture the log using tee, or just by copying and pasting from the terminal.
  2. If you do, then let's try it again, but this time filtering out the noisy 3F00 register: ./tools/regtool XX:YY | grep -vF -e '[3F00]'. I expect after the initial registers, it should stop printing stuff.
  3. On another terminal, let's try writing to the 3F00 register (which is what you do on the UCX II to see changes from the device). Try ./tools/regtool -w XX:YY 3F00 0001.
  4. Hopefully, this will show some more registers on the first terminal.
  5. You can then try setting 3F00 to another value, i.e. ./tools/regtool -w XX:YY 3F00 0002, which perhaps might show even more registers. For normal operation, the iPad (and even TotalMix in USB mode) set this register roughly 25-30 times a second to values 0000 through 000F, then cycling back to 0000. This causes the device to notify TotalMix when registers change. I'm not sure what the value means, but as long as you set it to a new value, it seems to send me changed registers. I suspect it is some sort of sequence number.

My debian is headless. No Window Manager. Just cli. But sure i could run Apps via x11. How would i set it best? I mean, as it is in CC Mode while plugged to debian, i have no possibility atm to control the DSP Effects... Ahh - via iPad... OK i have the TM App there. But how can i log the Sysex Data then? How did you connect it? You described that you logged it via wireshark (and your dissector) via a raspi. Yesterday, I tried the 3 lua scripts, they throw some errors. But i will look deeper into this later.

There's no need for any GUI stuff, just create a file config.mk in the oscmix source directory containing GTK=n. You should be able to do all of this from the CLI.

The Lua scripts are probably not useful for you in their current state. The wireshark dissector, rme.lua, needs to go in the wireshark plugin directory, and needs a patch to wireshark so it can hook into the SysEx dissector for the RME manufacturer ID.

On the UCX II, I am able to set stuff like EQ via the rotary encoder and LCD. But I guess you can't do that on the 802. Assuming the the settings you change on the iPad persist when you connect back to the Mac, that should be sufficient. If you turn on some DSP function with the iPad and then do that same MIDI dump, I expect we'll see a different value for the 3F00 register. However, first see above about regtool; I think that might be a more productive thing to try.

  • Yes, it has 30+30 Channels... But, if i remember right, in CC Mode it has only 28+28. But not sure atm. Will check this.

If you look into the manual of the Octamic XTC, there is a detailed MIDI implementation description in the last chapter. Maybe it is similar to our interfaces?

They both use SysEx, but I think the similarities might end there. It's a good thought, though.

Thanks again for your help!

huddx01 commented 6 months ago

I've added a new tool at tools/regtool.c. It uses alsa-seq, so you'd need to be on your headless Debian for this. You can build it with make tools/regtool....

yes i saw your changes. and saw the new entries in the makefile. But:

make tools/regtool
cc -std=c11  -O1 $(pkg-config --cflags alsa) -c -o tools/regtool.o tools/regtool.c
In file included from /usr/include/alsa/asoundlib.h:49,
                 from tools/regtool.c:2:
/usr/include/alsa/global.h:144:8: error: redefinition of ‘struct timespec’
  144 | struct timespec {
      |        ^~~~~~~~
In file included from /usr/include/time.h:42,
                 from /usr/include/alsa/global.h:32,
                 from /usr/include/alsa/asoundlib.h:49,
                 from tools/regtool.c:2:
/usr/include/arm-linux-gnueabihf/bits/types/struct_timespec.h:10:8: note: originally defined here
   10 | struct timespec
      |        ^~~~~~~~
make: *** [Makefile:75: tools/regtool.o] Fehler 1

There's no need for any GUI stuff, just create a file config.mk in the oscmix source directory containing GTK=n. You should be able to do all of this from the CLI.

sure - was just because just wanted to see your gtk magic ;-)

The Lua scripts are probably not useful for you in their current state. The wireshark dissector, rme.lua, needs to go in the wireshark plugin directory

yeah, i know where dissectors should be located in ws...

and needs a patch to wireshark so it can hook into the SysEx dissector for the RME manufacturer ID.

thanks for the hint - will read more about that.

On the UCX II, I am able to set stuff like EQ via the rotary encoder and LCD. But I guess you can't do that on the 802. Assuming the the settings you change on the iPad persist when you connect back to the Mac, that should be sufficient. If you turn on some DSP function with the iPad and then do that same MIDI dump, I expect we'll see a different value for the 3F00 register. However, first see above about regtool; I think that might be a more productive thing to try.

You are right. The 802 has no LCD. Just Potis on the front for the 4 Mic/Line Inputs. Only the 8 Analog Ins on the back have a "digital" gain. A good indicator for the capabilities of each unit is the possibility to load offline devices in Totalmix and see what is available there...

Good idea - setting the dsps on iPad and then checking the 3F00 register. Will do that.

And yes - the regtool would be fine - if i could compile it ^^

PS: I think, i have a similar purpose as you have: Just for fun in my free time. And always interested to learn.

Thanks

michaelforney commented 6 months ago
make tools/regtool
cc -std=c11  -O1 $(pkg-config --cflags alsa) -c -o tools/regtool.o tools/regtool.c
In file included from /usr/include/alsa/asoundlib.h:49,
                 from tools/regtool.c:2:
/usr/include/alsa/global.h:144:8: error: redefinition of ‘struct timespec’
  144 | struct timespec {
      |        ^~~~~~~~
In file included from /usr/include/time.h:42,
                 from /usr/include/alsa/global.h:32,
                 from /usr/include/alsa/asoundlib.h:49,
                 from tools/regtool.c:2:
/usr/include/arm-linux-gnueabihf/bits/types/struct_timespec.h:10:8: note: originally defined here
   10 | struct timespec
      |        ^~~~~~~~
make: *** [Makefile:75: tools/regtool.o] Fehler 1

Are you on the latest commit? I thought this would be fixed by b8083e329710ba6e2120deadc31bb9c40c90f9b5 (at least, it fixed the Debian builder at https://builds.sr.ht/~mcf/job/1153088).

There's no need for any GUI stuff, just create a file config.mk in the oscmix source directory containing GTK=n. You should be able to do all of this from the CLI.

sure - was just because just wanted to see your gtk magic ;-)

Ok, it shouldn't be too hard to fix it. I'll let you know in the other issue when you can try again.

The Lua scripts are probably not useful for you in their current state. The wireshark dissector, rme.lua, needs to go in the wireshark plugin directory

yeah, i know where dissectors should be located in ws...

Ah, great!

and needs a patch to wireshark so it can hook into the SysEx dissector for the RME manufacturer ID.

thanks for the hint - will read more about that.

The patch I used is https://gitlab.com/mforney/wireshark/-/commit/b5e5f63c2cc5257b1fb3c971b96e72b92b5231a0. I still need to do more testing and submit it upstream.

PS: I think, i have a similar purpose as you have: Just for fun in my free time. And always interested to learn.

:)

huddx01 commented 6 months ago

sorry, didnt see you already fixed the regtool... compiling works. testing atm...

huddx01 commented 6 months ago

sorry, i did sth wrong, had not restarted the unit...

Now, after a power off-on of the unit:

The ----- mark in the middle is the moment, after -w XX:YY 3F00 0001


[3F03]=0000
[3F02]=00FF
[3F01]=FF07
[3F02]=01FF
[3F03]=0000
[3F02]=02FF
[3F01]=FF07
[3F02]=03FF
[3F04]=B500
[3F03]=0000
[3F02]=04FF
[3F01]=FF07
[3F02]=05FF
[3F03]=0000
[3F02]=06FF
[3F01]=FF07
[3F02]=07FF
[3F05]=0000
[3F03]=0000
[3F02]=08FF
[3F01]=FF07
[3F02]=09FF
[3F03]=0000
[3F02]=0AFF
[3F01]=FF07
[3F02]=0BFF
[3F03]=0000
[3F02]=0CFF
[3F01]=FF07
[3F02]=0DFF
[3F03]=0000
[3F02]=0EFF
[3F01]=FF07
[3F02]=0FFF
[3F03]=0000
[3F02]=10FF
[3F01]=FF07
[3F02]=11FF
[3F03]=0000
[3F02]=12FF
[3F01]=FF07
[3F02]=13FF
[3F04]=B500
[3F03]=0000
[3F02]=14FF
[3F01]=FF07
[3F02]=15FF
[3F03]=0000
[3F02]=16FF
[3F01]=FF07
[3F02]=17FF
[3F05]=0000
[3F03]=0000
[3F02]=18FF
[3F01]=FF07
[3F02]=19FF
[3F03]=0000
[3F02]=1AFF
[3F01]=FF07
[3F02]=1BFF
[3F03]=0000
[3F02]=1CFF
[3F01]=FF07
[3F02]=1DFF
[3F03]=0000
[3F02]=1EFF
[3F01]=FF07
[3F02]=1FFF

-----  w XX:YY 3F00 0001 down here-----

[3F01]=FF07
[3F02]=21FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=22FF
[3F10]=7070
[3F50]=0000
[3F01]=FF07
[3F02]=23FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=24FF
[3F10]=7070
[3F50]=0000
[3F01]=FF07
[3F02]=25FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=26FF
[3F10]=7070
[3F50]=0000
[3F01]=FF07
[3F02]=27FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=28FF
[3F10]=7070
[3F50]=0000
[3F01]=FF07
[3F02]=29FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=2AFF
[3F10]=7070
[3F50]=0000
[3F01]=FF07
[3F02]=2BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=2CFF
[3F10]=7070
[3F50]=0000
[3F01]=FF07
[3F02]=2DFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=2EFF
[3F10]=7070
[3F50]=0000
[3F01]=FF07
[3F02]=2FFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=30FF
[3F10]=7070
[3F50]=0000
[3F01]=FF07
[3F02]=31FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=32FF
[3F10]=7070
[3F50]=0000
[3F01]=FF07
[3F02]=33FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000

---- -w XX:YY 3F00 0002 down here ----
[3F01]=FF07
[3F02]=27FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=28FF
[3F10]=7070
[3F50]=0000
[3F01]=FF07
[3F02]=29FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=2AFF
[3F10]=7070
[3F50]=0000
[3F01]=FF07
[3F02]=2BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=2CFF
[3F10]=7070
[3F50]=0000
[3F01]=FF07
[3F02]=2DFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=2EFF
[3F10]=7070
[3F50]=0000
[3F01]=FF07
[3F02]=2FFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=30FF
[3F10]=7070
[3F50]=0000
[3F01]=FF07
[3F02]=31FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=32FF
[3F10]=7070
[3F50]=0000
[3F01]=FF07
[3F02]=33FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=34FF
[3F10]=7070
[3F50]=0000
[3F01]=FF07
[3F02]=35FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=36FF
[3F10]=7070
[3F50]=0000
[3F01]=FF07
[3F02]=37FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=38FF
[3F10]=7070
[3F50]=0000
[3F01]=FF07
[3F02]=39FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
michaelforney commented 6 months ago

Ok, this looks very promising. As expected, a couple more registers show up (3F10, 3F50), and we see the 3F02 register get further along its cycle, all the way to 0x39FF.

Let's try a register dump. First, you can set up regtool to monitor register changes again, and this time ignore all these registers that the device is constantly sending, so we can focus on new ones.

./tools/regtool XX:YY | grep -v -e '\[3F0[0-5]\]' -e '\[3F10\]' -e '\[3F50\]'

Now, we can set up a loop to periodically change the value of 3F00, so we can see when any register changes:

while true; do for val in 0 1 2 3 4 5 6 7 8 9 a b c d e f; do echo "3F00 $val"; sleep 0.2; done; done | ./tools/regtool -w XX:YY

(this fractional sleep is non-standard, but works in GNU sleep, so should work for you)

At this point, I expect that if you turn one of the headphone volume knobs or input gain knobs, we'll see updates from the device, and we can begin to map the registers for the 802.

The next thing to try is to trigger the device to dump all the registers for its current state. On the UCX II, this is done by setting 3E04 to 67CD. So we can try the same thing here.

./tools/regtool -w XX:YY 3E04 67CD
huddx01 commented 6 months ago

haha thougt similar, i tried to make a shell script for that^^

from 0 to F

#!/bin/bash

# Function to execute the command and separate output into sections
execute_and_separate() {
    cmd="$1"
    echo "------------" >> regtool_output.txt
    eval $cmd >> regtool_output.txt
}

# Prompt the user to input the port ID
read -p "Enter the port ID (e.g., 24:1) and wait 15 seconds.:" port_id

# Execute the command for the initial port ID in the background and separate output into sections
execute_and_separate "./regtool $port_id | grep -vF -e '[3F00]'" > regtool_output.txt &

# Function to increment the last digit from 0 to F
increment_hex() {
    printf "%X\n" $(($(printf "%d" 0x$1) + 1))
}

# Loop from 1 to F
for ((i=0; i<=15; i++)); do
    # Convert the number to hexadecimal and add leading zeros if necessary
    hex=$(printf "%X\n" $i)
    if [ ${#hex} -eq 1 ]; then
        hex="0$hex"
    fi

    # Construct the command with the incremented hex number and execute it
    execute_and_separate "./regtool -w $port_id 3F00 00$hex"

    # Wait for 1 seconds
    sleep 1
done

# Terminate the background process
killall regtool

but doesnt work really clean. il try your suggestion

huddx01 commented 6 months ago

ok this one is iterating from 0 - F

while true; do for val in 0 1 2 3 4 5 6 7 8 9 a b c d e f; do echo "3F00 $val"; sleep 0.2; done; done | ./regtool -w xx:yy
[3F00]=0000
[3F00]=0001
[3F00]=0002
[3F00]=0003
[3F00]=0004
[3F00]=0005
[3F00]=0006
[3F00]=0007
[3F00]=0008
[3F00]=0009
[3F00]=000A
[3F00]=000B
[3F00]=000C
[3F00]=000D
[3F00]=000E
[3F00]=000F
[3F00]=0000
[3F00]=0001
[3F00]=0002
[3F00]=0003
[3F00]=0004
[3F00]=0005
[3F00]=0006
[3F00]=0007
[3F00]=0008
[3F00]=0009
[3F00]=000A
[3F00]=000B
[3F00]=000C
[3F00]=000D
[3F00]=000E
[3F00]=000F
...

and the filtered listener, just gives the following:

./regtool xx:yy | grep -v -e '\[3F0[0-5]\]' -e '\[3F10\]' -e '\[3F50\]'
[3D21]=0008

works as expected? or did i misunderstood sth?

michaelforney commented 6 months ago

Yes, this is as expected. Do you see any output from the listener if you turn any of the knobs on the 802?

Edit: err, I see you mentioned earlier about digital gain, so maybe you won't see anything. In any case, try setting 3E04 to 67CD to do a register dump.

huddx01 commented 6 months ago

As you said: Tried to move the Potis. And as expected: Nothing happens, as they are analog.

In any case, try setting 3E04 to 67CD to do a register dump.

the listener:

./regtool xx:yy | grep -vF -e '[3F00]'
[3F03]=0000
[3F02]=30FF
[3F10]=7070
[3F50]=0000
[3F01]=FF07
[3F02]=31FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=32FF
[3F10]=7070
[3F50]=0000
[3F01]=FF07
[3F02]=33FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=34FF
[3F10]=7070
[3F50]=0000
[3F01]=FF07
[3F02]=35FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=36FF
[3F10]=7070
[3F50]=0000
[3F01]=FF07
[3F02]=37FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=38FF
[3F10]=7070
[3F50]=0000
[3F01]=FF07
[3F02]=39FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=3AFF
[3F10]=7070
[3F50]=0000
[3F01]=FF07
[3F02]=3BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=00FF
[3F10]=7070
[3F50]=0000
[3F01]=FF07
[3F02]=01FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=02FF
[3F10]=7070
[3F50]=0000
[3F01]=FF07
[3F02]=03FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=04FF
[3F10]=7070
[3F50]=0000
[3F01]=FF07
[3F02]=05FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=06FF
[3F10]=7070
[3F50]=0000
[3F01]=FF07

after the dump executed:

 ./regtool -w xx:yy 3E04 67CD
 [3E04]=67CD
michaelforney commented 6 months ago

As you said: Tried to move the Potis. And as expected: Nothing happens, as they are analog.

I see, makes sense. Though one thing I still don't understand: I did as you suggested and loaded an offline 802 in TotalMix. If the headphone volume controls are only analog, what do the volume sliders do for Phones 1 and Phones 2 in the output channel row of TotalMix? Is it just a separate volume stage?

after the dump executed:

 ./regtool -w xx:yy 3E04 67CD
 [3E04]=67CD

Hmm, ok. Did you have the iterating writer running at the same time? That is needed to see any output from the register dump.

If that doesn't work, it seems like it might be a bit trickier to map registers on the 802, since we don't have any way to control settings from the device. It might be necessary to set up a raspberry pi proxy between an iPad and the device to fully map all the registers. The process is fairly involved, but is described in doc/capture.md. The setup is you have an iPad hooked up to the raspberry pi's USB-C port, the 802 hooked up to one of the raspberry pi's USB-A ports, and then you enable dtoverlay=dwc2 in your config.txt in the boot partition. Then, you should be able to follow those instructions, substituting the correct values for idProduct and idVendor. I hope that's sufficient to get the iPad to detect the rpi as an 802.

I should be able to test at least part of this locally, but the iPad and rpi I was using were borrowed from a friend. Maybe I can get a hold of them again sometime this week to confirm that the setup should work.

huddx01 commented 6 months ago

I see, makes sense. Though one thing I still don't understand: I did as you suggested and loaded an offline 802 in TotalMix. If the headphone volume controls are only analog, what do the volume sliders do for Phones 1 and Phones 2 in the output channel row of TotalMix? Is it just a separate volume stage?

The sliders in TM act like volume control via software. As you can see in the pic, the Volume controller is just a analog resistance poti, located after the DAC. scematic

Hmm, ok. Did you have the iterating writer running at the same time? That is needed to see any output from the register dump.

No, Ok, retried it and now it looks better.

./tools/regtool 20:1 | grep -vF -e '[3F00]'
[3F03]=0000
[3F02]=10FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=11FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=12FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=13FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=14FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=15FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=16FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=17FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=18FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=19FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=1AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=1BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=1CFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=1DFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=1EFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=1FFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=20FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=21FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=22FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=23FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=24FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=25FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=26FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=27FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=28FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=29FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=2AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=2BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=2CFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=2DFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=2EFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=2FFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=30FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=31FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=32FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=33FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=34FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=35FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=36FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=37FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=38FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=39FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=3AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=3BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=00FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=01FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=02FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=03FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=04FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=05FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=06FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=07FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=08FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=09FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=0AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=0BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=0CFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=0DFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=0EFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=0FFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=10FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=11FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=12FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=13FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=14FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=15FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=16FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=17FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=18FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=19FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=1AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=1BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=1CFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=1DFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=1EFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=1FFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=20FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=21FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=22FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=23FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=24FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=25FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=26FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=27FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=28FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=29FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=2AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=2BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=2CFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=2DFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=2EFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=2FFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=30FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=31FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=32FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=33FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=34FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=35FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=36FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=37FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=38FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=39FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=3AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=3BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=00FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=01FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=02FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=03FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=04FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=05FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=06FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=07FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=08FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=09FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=0AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=0BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=0CFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=0DFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=0EFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=0FFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=10FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=11FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=12FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=13FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=14FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=15FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=16FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=17FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=18FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=19FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=1AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=1BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=1CFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=1DFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=1EFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=1FFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=20FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=21FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=22FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=23FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=24FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=25FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=26FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=27FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=28FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=29FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=2AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=2BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=2CFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=2DFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=2EFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=2FFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=30FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=31FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=32FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=33FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=34FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=35FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=36FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=37FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=38FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=39FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=3AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=3BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=00FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=01FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=02FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=03FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=04FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=05FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=06FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=07FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=08FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=09FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=0AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=0BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=0CFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=0DFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=0EFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=0FFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=10FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=11FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=12FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=13FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=14FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=15FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=16FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=17FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=18FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=19FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=1AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=1BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=1CFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=1DFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=1EFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=1FFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=20FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=21FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=22FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=23FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=24FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=25FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=26FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=27FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=28FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=29FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=2AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=2BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=2CFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=2DFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=2EFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=2FFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=30FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=31FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=32FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=33FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=34FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=35FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=36FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=37FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=38FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=39FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=3AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=3BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=00FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=01FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=02FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=03FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=04FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=05FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=06FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=07FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=08FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=09FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=0AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=0BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=0CFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=0DFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=0EFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=0FFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=10FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=11FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=12FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=13FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=14FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=15FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=16FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=17FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=18FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=19FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=1AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=1BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=1CFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=1DFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=1EFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=1FFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=20FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=21FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=22FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=23FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=24FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=25FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=26FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=27FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=28FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=29FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=2AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=2BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=2CFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=2DFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=2EFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=2FFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=30FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=31FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=32FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=33FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=34FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=35FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=36FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=37FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=38FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=39FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=3AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=3BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=00FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=01FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=02FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=03FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=04FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=05FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=06FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=07FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=08FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=09FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=0AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=0BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=0CFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=0DFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=0EFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=0FFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=10FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=11FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=12FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=13FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=14FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=15FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=16FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=17FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=18FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=19FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=1AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=1BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=1CFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=1DFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=1EFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=1FFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=20FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=21FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=22FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=23FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=24FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=25FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=26FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=27FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=28FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=29FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=2AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=2BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=2CFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=2DFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=2EFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=2FFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=30FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=31FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=32FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=33FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=34FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=35FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=36FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=37FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=38FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=39FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=3AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=3BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=00FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=01FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=02FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=03FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=04FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=05FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=06FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=07FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=08FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=09FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=0AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=0BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=0CFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=0DFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=0EFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=0FFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=10FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=11FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=12FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=13FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=14FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=15FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=16FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=17FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=18FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=19FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=1AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=1BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=1CFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=1DFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=1EFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=1FFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=20FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=21FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=22FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=23FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=24FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=25FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=26FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=27FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=28FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=29FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=2AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=2BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=2CFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=2DFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=2EFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=2FFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=30FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=31FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=32FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=33FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=34FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=35FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=36FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=37FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=38FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=39FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=3AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=3BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=00FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=01FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=02FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=03FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=04FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=05FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=06FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=07FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=08FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=09FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=0AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=0BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=0CFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=0DFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=0EFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=0FFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=10FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=11FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=12FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=13FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=14FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=15FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=16FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=17FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=18FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=19FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=1AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=1BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=1CFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=1DFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=1EFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=1FFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=20FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=21FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=22FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=23FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=24FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=25FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=26FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=27FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=28FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=29FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=2AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=2BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=2CFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=2DFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=2EFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=2FFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=30FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=31FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=32FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=33FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=34FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=35FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=36FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=37FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=38FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=39FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=3AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=3BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=00FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=01FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=02FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=03FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=04FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=05FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=06FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=07FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=08FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=09FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=0AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=0BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=0CFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=0DFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=0EFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=0FFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=10FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=11FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=12FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=13FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=14FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=15FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=16FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=17FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=18FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=19FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=1AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=1BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=1CFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=1DFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=1EFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=1FFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=20FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=21FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=22FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=23FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=24FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=25FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=26FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=27FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=28FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=29FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=2AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=2BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=2CFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=2DFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=2EFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=2FFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=30FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=31FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=32FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=33FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=34FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=35FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=36FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=37FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=38FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=39FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=3AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=3BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=00FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=01FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=02FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=03FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=04FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=05FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=06FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=07FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=08FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=09FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=0AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=0BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=0CFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=0DFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=0EFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=0FFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=10FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=11FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=12FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=13FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=14FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=15FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=16FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=17FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=18FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=19FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=1AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=1BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=1CFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=1DFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=1EFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=1FFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=20FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=21FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=22FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=23FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=24FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=25FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=26FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=27FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=28FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=29FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=2AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=2BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=2CFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=2DFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=2EFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=2FFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=30FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=31FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=32FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=33FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=34FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=35FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=36FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=37FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=38FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=39FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=3AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=3BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=00FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=01FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=02FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=03FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=04FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=05FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=06FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=07FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=08FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=09FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=0AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=0BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=0CFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=0DFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=0EFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=0FFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=10FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=11FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=12FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=13FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=14FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=15FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=16FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=17FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=18FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=19FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=1AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=1BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=1CFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=1DFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=1EFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=1FFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=20FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=21FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=22FF
----------stopped the iterating task here----
---------fired the regtool -w xx:yy 3E04 67CD register dump here------
[3F03]=0000
[3F02]=1AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=1BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=1CFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=1DFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=1EFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=1FFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=20FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=21FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=22FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=23FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=24FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=25FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=26FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=27FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=28FF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=29FF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=2AFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=2BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=2CFF
[3F10]=7070
[3F50]=0000
[3F01]=FFFF
[3F02]=2DFF
michaelforney commented 6 months ago

The sliders in TM act like volume control via software. As you can see in the pic, the Volume controller is just a analog resistance poti, located after the DAC.

Got it, thanks for explaining.

Hmm, ok. Did you have the iterating writer running at the same time? That is needed to see any output from the register dump.

No, Ok, retried it and now it looks better.

  • have started the listener in terminal 1, with 3F00 filter
  • started the iterator in terminal 2
  • stopped the iterator, then fired the register dump

Sorry, I should have been clearer. The iterator will cause the device to keep sending these register changes. It needs to be running while we do the register dump, so that we see the registers from the dump. Right now we aren't interested in these 3F** registers, which is why I suggested filtering further with grep -v -e '\[3F0[0-5]\]' -e '\[3F10\]' -e '\[3F50\]'. Once that's running with the iterator, the monitor should reach a steady state and not print anything.

Then, while the iterator and monitor are still running, we can send 3E04 67CD (in a third terminal), which I hope will show new things on the monitor that we aren't filtering out.

Thanks for your patience!

[3F02]=3BFF
[3F10]=7070
[3F50]=0000
[3F03]=0000
[3F02]=00FF

This is good, we see 3F02 hit 3BFF (channel 60), then roll back to 00FF (channel 1). This supports the theory that 3F02 is analogous to 3082 on the UCX II.

huddx01 commented 6 months ago

ok, clear. give me a minute. BTW: I installed a fresh debian on a VM now. arm64 arch, as my M1 mac is the host. all the compilations (incl gtk) went flawlessly. And though i was afraid, the FF802 could maybe not being recognized properly due the forwarding of USB through the host - it seems to work flawlessly.

huddx01 commented 6 months ago

1). run: Had 3 terminals open. Anyhow, the attached file is the "tee" result, if i filter just 3F00 in listener, iterating in 2nd terminal [3F00] from 0001 to 000F and in the 3rd terminal i fire up to register 3E04 the value 67CD (3 or 4 times with a delay about 5 seconds, so that the iteration runs a few full cycles between each new refire).

reg_dmp.txt

2). run:
Nope, nothing is shown when the listener filter is -e '[3F0[0-5]]' -e '[3F10]' -e '[3F50]... - same conditions as above in 1)

Maybe another useful info: The 802 in CC Mode shows just 22 In and 22 Out Channels, as i mentioned before. On Mac, the vm and raspi. Just checked this. Is it similar on the UCX II? But - if i understood right - the shown channels shouldnt matter, as we are trying to present us its full capabilities via a lower layer by accessing its registers directly.

Correct me if i am completly wrong (just want to understand):

We filter out every register which matches [3F0[0-5]], [3F10] and [3F50] - OK clear. The iterator triggers register [3F00] (DSP Version / Load) from 0001 to 000F. The fire up writer to register 3E04 with the value 67CD triggers a register dump. OK...

But maybe the 802 has another register which causes the dump? I mean, analogue to the channel registers, you mentioned before:

This supports the theory that 3F02 is analogous to 3082 on the UCX II.

So 3F02 - 3082 = 0E80 (the difference between 802 and UCX II) And 3E04 + 0E80 = 4C84 (the Register + the "shifted" difference 0E80 between 802 and UCX II) So maybe, we should raise the register address accordingly? But just an idea... sorry, i did not have the time to read carefully (and understand) your description in protocol.md till now.. So, please correct me, Its really satisfying me, love such things :)

michaelforney commented 6 months ago

1). run: Had 3 terminals open. Anyhow, the attached file is the "tee" result, if i filter just 3F00 in listener, iterating in 2nd terminal [3F00] from 0001 to 000F and in the 3rd terminal i fire up to register 3E04 the value 67CD (3 or 4 times with a delay about 5 seconds, so that the iteration runs a few full cycles between each new refire).

reg_dmp.txt

2). run: Nope, nothing is shown when the listener filter is -e '[3F0[0-5]]' -e '[3F10]' -e '[3F50]... - same conditions as above in 1)

Sounds like you did everything correctly, thanks for trying. I think the 802 must use a different register than 3E04 (or possibly different value?).

Maybe another useful info: The 802 in CC Mode shows just 22 In and 22 Out Channels, as i mentioned before. On Mac, the vm and raspi. Just checked this. Is it similar on the UCX II? But - if i understood right - the shown channels shouldnt matter, as we are trying to present us its full capabilities via a lower layer by accessing its registers directly.

On the UCX II, it presents a USB audio streaming interface in each direction which can be configured as 8, 14, 16, or 20 channel modes, but I can always control all 40 channels from oscmix.

I suspect we'll be able to control all 30/30 channels via the MIDI sysex messages (assuming the iPad TotalMix can do this), even if they don't show up for input/output.

Correct me if i am completly wrong (just want to understand):

We filter out every register which matches [3F0[0-5]], [3F10] and [3F50] - OK clear. The iterator triggers register [3F00] (DSP Version / Load) from 0001 to 000F. The fire up writer to register 3E04 with the value 67CD triggers a register dump. OK...

Yep, that's correct.

But maybe the 802 has another register which causes the dump? I mean, analogue to the channel registers, you mentioned before:

That's my current thinking as well.

Another thing you could try: on the UCX II, channel 1 mute is is at 0502. You could try playing something to output channel 1, and see if ./regtool -w 24:1 0502 1 mutes it and ./regtool -w 24:1 0502 0 unmutes it. In this test, you don't need to set up the monitor/iterator.

This supports the theory that 3F02 is analogous to 3082 on the UCX II.

So 3F02 - 3082 = 0E80 (the difference between 802 and UCX II) And 3E04 + 0E80 = 4C84 (the Register + the "shifted" difference 0E80 between 802 and UCX II) So maybe, we should raise the register address accordingly? But just an idea... sorry, i did not have the time to read carefully (and understand) your description in protocol.md till now.. So, please correct me, Its really satisfying me, love such things :)

I think it's unlikely that it's just a simple offset for all registers, but it's not a bad thought.

One other idea I had since you mentioned you had an M1 Mac. I think I read that you could install iPad apps on M1 Macs. I wonder if it's possble to install TotalMix for iPad on your Mac? If that's possible, I wonder if we could capture MIDI packets that way without the raspberry pi.

Anyway, hopefully I'll be able to mess around with an iPad and rpi sometime in the next few days

huddx01 commented 6 months ago

It might be necessary to set up a raspberry pi proxy between an iPad and the device to fully map all the registers. The process is fairly involved, but is described in doc/capture.md. The setup is you have an iPad hooked up to the raspberry pi's USB-C port, the 802 hooked up to one of the raspberry pi's USB-A ports, and then you enable dtoverlay=dwc2 in your config.txt in the boot partition. Then, you should be able to follow those instructions, substituting the correct values for idProduct and idVendor. I hope that's sufficient to get the iPad to detect the rpi as an 802.

Ah ok - i understand. The pi mirrors the two USB Ports.Two differences:

Anyhow, this should not matter.

Yesterday, i already tried to set up the mirror port on the pi. From your capture.md UDC=fe980000.usb # raspberry pi 4 udc (see /sys/class/udc)

My /sys/class/udc is empty on pi3. Any ideas where i could get the location for my corresponding port, the 802 is connected to, else?

Maybe you noticed this, too - I wonder that the vID (only in CC Mode) appears as 0x0424 (which is not RME), why?

idVendor           0x0424 Microchip Technology, Inc. (formerly SMSC)
idProduct          0x3fdd 

Same on pi, Mac, other systems. @Sojuzstudio s descriptor on rme forum showed the same. Anyhow... i set this yesterday

echo 0x0424 > idVendor                    # set vendor id (RME)
echo 0x3fdd  > idProduct                   # set product id (Fireface 802)

typo? functions/midi.usb0 # add midi function

i assume you meant a "mkdir functions/midi.usb0" at this point?

and when i finally tried the echo "$UDC" > UDC to overwrite the UDC file with the contents from the env var (set at the begginig) in the /sys/kernel/config/usb_gadget dir, i got a cannot write error (as root - but dont remeber if it was due to the file was in use by another process or sth else)

Last question: Any idea how i could delete the mirroring stuff quite easy, just to revert the yesterdays experiment an in case i need to retry...

I just diged my old iPad out from the black hole, but i has to be recharged - what else? ;-) can take a while and as the camkit adapter does not charge while its plugged in, i have to be patient^^.

But i can prepare the usb mirorring in the meantime.

michaelforney commented 6 months ago

Ah ok - i understand. The pi mirrors the two USB Ports.Two differences:

  • I have a pi3b -> so no USB-C, Just 4 USB2 Ports

Unfortunately, the 3B won't work because it doesn't have a UDC (USB Device Controller), so it can't act as a USB device when hooked up to the iPad.

I have a 3B as well, so I had to borrow a 4 from a friend for this. I think only the 4, 5, and zero have a UDC.

  • And an ancient iPad (but i was able to use the 802 via the Camera Connection Kit Adapter with TM)

Anyhow, this should not matter.

Yeah, if the iPad supports TotalMix, it should work.

Maybe you noticed this, too - I wonder that the vID (only in CC Mode) appears as 0x0424 (which is not RME), why?

idVendor           0x0424 Microchip Technology, Inc. (formerly SMSC)
idProduct          0x3fdd 

Same on pi, Mac, other systems. @Sojuzstudio s descriptor on rme forum showed the same. Anyhow... i set this yesterday

I noticed this as well. I'm not sure why it uses that vendor ID in CC mode.

echo 0x0424 > idVendor                    # set vendor id (RME)
echo 0x3fdd  > idProduct                   # set product id (Fireface 802)

typo? functions/midi.usb0 # add midi function

i assume you meant a "mkdir functions/midi.usb0" at this point?

Good catch. Fixed now.

and when i finally tried the echo "$UDC" > UDC to overwrite the UDC file with the contents from the env var (set at the begginig) in the /sys/kernel/config/usb_gadget dir, i got a cannot write error (as root - but dont remeber if it was due to the file was in use by another process or sth else)

Last question: Any idea how i could delete the mirroring stuff quite easy, just to revert the yesterdays experiment an in case i need to retry...

I added some instructions for removing the gadget:

echo '' > UDC                             # unbind from udc
rm configs/c.1/midi.usb0                  # detach midi function from config
rmdir configs/c.1 functions/midi.usb0     # remove config and midi function
cd ..
rmdir g1                                  # remove gadget

I just diged my old iPad out from the black hole, but i has to be recharged - what else? ;-) can take a while and as the camkit adapter does not charge while its plugged in, i have to be patient^^.

But i can prepare the usb mirorring in the meantime.

I'm in a similar position. I have a borrowed iPad, but the battery is dead and I don't have any lightning cables. Need to get a hold of one in order to do more testing. Even without an 802, you've given me enough info that I should be able to get the iPad to detect the rpi as an 802, which will enable me to see what registers it sets during the initialization sequence.

huddx01 commented 6 months ago

I suspect we'll be able to control all 30/30 channels via the MIDI sysex messages (assuming the iPad TotalMix can do this), even if they don't show up for input/output.

iPad has enough power about 5% to start it up. Looking in the TMFX App, which was configured the last time i had it plugged in, although the 802 is not plugged in atm: All 60 Channels are visible... So - you are right.

Another thing you could try: on the UCX II, channel 1 mute is is at 0502. You could try playing something to output channel 1, and see if ./regtool -w 24:1 0502 1 mutes it and ./regtool -w 24:1 0502 0 unmutes it. In this test, you don't need to set up the monitor/iterator.

I am on VM atm so its 20:1...

Have to mention, that the debian offers only choice between SPDIF or Analog for the 802 in gnome. It is set to analog, and i hear the sounds coming from AN1/2 OUT ./tools/regtool -w 20:1 0502 0/1 does not Un/Mute the left Channel (should be AN1)

In a second run i had the listener running without any filters... What i noticed, is that after the first 0502 0 the Unit throws some new? registers and then constantly sends [3F00]=0917... After 0502 1 a similar behavior....

-----
./tools/regtool -w 20:1 0502 0 was executed
--------
[0502]=0001
[3F00]=0917
[3F03]=0000
[3F02]=38FF
[3F10]=7070
[3F50]=0000
[3F00]=0917
[3F01]=FFFF
[3F02]=39FF
[3F10]=7070
[3F50]=0000
[3F00]=0917
[3F03]=0000
[3F02]=3AFF
[3F10]=7070
[3F50]=0000
[3F00]=0917
[3F01]=FFFF
[3F02]=3BFF
[3F10]=7070
[3F50]=0000
[3F00]=0917
[3F03]=0000
[3F02]=00FF
[3F10]=7070
[3F50]=0000
[3F00]=0917
[3F01]=FFFF
[3F02]=01FF
[3F10]=7070
[3F50]=0000
[3F00]=0917
[3F03]=0000
[3F02]=02FF
[3F10]=7070
[3F50]=0000
[3F00]=0917
[3F01]=FFFF
[3F02]=03FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F00]=0917
[3F03]=0000
[3F02]=04FF
[3F10]=7070
[3F50]=0000
[3F00]=0917
[3F01]=FFFF
[3F02]=05FF
[3F10]=7070
[3F50]=0000
[3F00]=0917
[3F03]=0000
[3F02]=06FF
[3F10]=7070
[3F50]=0000
[3F00]=0917
[3F01]=FFFF
[3F02]=07FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F00]=0917
[3F03]=0000
[3F02]=08FF
[3F10]=7070
[3F50]=0000
[3F00]=0917
[3F01]=FFFF
[3F02]=09FF
[3F10]=7070
[3F50]=0000
[3F00]=0917
[3F03]=0000
[3F02]=0AFF
[3F10]=7070
[3F50]=0000
[3F00]=0917
[3F01]=FFFF
[3F02]=0BFF
[3F10]=7070
[3F50]=0000
[3F00]=0917
[3F03]=0000
[3F02]=0CFF
[3F10]=7070
[3F50]=0000
[3F00]=0917
[3F01]=FFFF
[3F02]=0DFF
[3F10]=7070
[3F50]=0000
[3F00]=0917
[3F03]=0000
[3F02]=0EFF
[3F10]=7070
[3F50]=0000
[3F00]=0917
[3F01]=FFFF
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
----
./tools/regtool -w 20:1 0502 1 was executed
----
[0502]=0000
[3F00]=0917
[3F03]=0000
[3F02]=18FF
[3F10]=7070
[3F50]=0000
[3F00]=0917
[3F01]=FFFF
[3F02]=19FF
[3F10]=7070
[3F50]=0000
[3F00]=0917
[3F03]=0000
[3F02]=1AFF
[3F10]=7070
[3F50]=0000
[3F00]=0917
[3F01]=FFFF
[3F02]=1BFF
[3F10]=7070
[3F50]=0000
[3F00]=0917
[3F03]=0000
[3F02]=1CFF
[3F10]=7070
[3F50]=0000
[3F00]=0917
[3F01]=FFFF
[3F02]=1DFF
[3F10]=7070
[3F50]=0000
[3F00]=0917
[3F03]=0000
[3F02]=1EFF
[3F10]=7070
[3F50]=0000
[3F00]=0917
[3F01]=FFFF
[3F02]=1FFF
[3F10]=7070
[3F50]=0000
[3F00]=0917
[3F03]=0000
[3F02]=20FF
[3F10]=7070
[3F50]=0000
[3F00]=0917
[3F01]=FFFF
[3F02]=21FF
[3F10]=7070
[3F50]=0000
[3F00]=0917
[3F03]=0000
[3F02]=22FF
[3F10]=7070
[3F50]=0000
[3F00]=0917
[3F01]=FFFF
[3F02]=23FF
[3F04]=B500
[3F10]=7070
[3F50]=0000
[3F00]=0917
[3F03]=0000
[3F02]=24FF
[3F10]=7070
[3F50]=0000
[3F00]=0917
[3F01]=FFFF
[3F02]=25FF
[3F10]=7070
[3F50]=0000
[3F00]=0917
[3F03]=0000
[3F02]=26FF
[3F10]=7070
[3F50]=0000
[3F00]=0917
[3F01]=FFFF
[3F02]=27FF
[3F05]=0000
[3F10]=7070
[3F50]=0000
[3F00]=0917
[3F03]=0000
[3F02]=28FF
[3F10]=7070
[3F50]=0000
[3F00]=0917
[3F01]=FFFF
[3F02]=29FF
[3F10]=7070
[3F50]=0000
[3F00]=0917
[3F03]=0000
[3F02]=2AFF
[3F10]=7070
[3F50]=0000
[3F00]=0917
[3F01]=FFFF
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917
[3F00]=0917

One other idea I had since you mentioned you had an M1 Mac. I think I read that you could install iPad apps on M1 Macs. I wonder if it's possble to install TotalMix for iPad on your Mac? If that's possible, I wonder if we could capture MIDI packets that way without the raspberry pi.

Good point. You are right. I tried that log time ago... Now - Every Developer can decide if the (iOS/iPadOS) app should be also available on Mac Appstore. RME decided not to do this, what i understand totally. 1) Unmodified iOS/iPadOS Apps always run in a sndboxed environment, a kind of wrapper acts as the bridge between the App and MacOS -> so its like an "on top level" thing and no possibility to provide direct low latency access via kernel or driverkit drivers. And Only for ARM Macs 2) More deeper integration would be possible if they would transfer the App to so called "Mac Catalyst" version (Intel and ARM possible). But: The older iPads would either lose support, or they would have to offer and maintain both versions... 3) As TM (and espacially the drivers) always existed for Macs - I would probably decide similar if i would be the manufacturer.

-> Makes no sense the extra effort regarding maintenance, support , etc .

But sure - i tried to grab the ipa from iPad and run it on the Mac. Was not possible to open, although i resigned it, and tried my best... But theoretically it should be possible. Another Idea i had is to run it in the iPad Simulator (provided with Xcode) but although i can sign in with my iCloud Account, Apple removed the AppStore on it - in older MacOS Versions it was possible...

So - theoretically i am sure, it would be possible to get a way around this, but this would be e new "big project" with lot of time consuming...

Sojuzstudio commented 6 months ago

Would this help?

https://freeusbanalyzer.com/ It is Windows app, but for Mac you Will find similat for sure.

huddx01 commented 6 months ago

Thanks for the hint. For mac i have to disable SIP to get direct access to HID devices. Would not be a problem so far...

but i found an easier solution to capture traffic - by activating the usbmon kernel module in the debian vm. Now i can capture traffic via wireshark on both usbmon interfaces - one for the iPad, the other for the 802. But i think the problem is to establish a "real" mirror between the ports. So that the iPad and 802 can directly talk with each other in both directions. Would it be possible to achieve this via the pipe option maybe? I newer used this before...

michaelforney commented 6 months ago

Thanks for the hint. For mac i have to disable SIP to get direct access to HID devices. Would not be a problem so far...

but i found an easier solution to capture traffic - by activating the usbmon kernel module in the debian vm. Now i can capture traffic via wireshark on both usbmon interfaces - one for the iPad, the other for the 802. But i think the problem is to establish a "real" mirror between the ports. So that the iPad and 802 can directly talk with each other in both directions. Would it be possible to achieve this via the pipe option maybe? I newer used this before...

I don't think it's possible. Here's some background: in USB, there are hosts and devices. A normal computer acts as a host, and normal devices (like the 802) act as devices. Some hardware like phones, tablets, and some raspberry pis have both a host controller and device controller. So you can connect devices to them (like a mouse or keyboard), but also connect them to a host, where they can act like a device (e.g. mass storage, ethernet for tethering, etc). If you hook up an iPad to a normal computer, the iPad will act like a device. We need it to be the other way around, so the iPad is the host, the linux machine acts as a device to the iPad, and a host to the 802. On hardware with a device controller, linux has a "gadget" subsystem that allows it to appear as a device. This is what doc/capture.md is using. Then, once that is set up, we can link up the MIDI ports between the gadget and the real device, so that the iPad can talk to the 802 through the linux machine, where we can log the MIDI traffic.

@huddx01, since you seem to be familiar with iOS development: do you know if it's possible to log MIDI events to a device from another app on an iPad? I did look into this briefly, and came to the conclusion that it wasn't possible, but I could be wrong about this.

But on the topic of USB capture, I thought of another avenue we could explore. On the UCX II, the registers used in CC-mode and USB-mode were essentially the same. But instead of encoding them as MIDI SysEx packets, they were written and read directly through a bulk endpoint (12 and 13). It seems that the 802 and the UCX II have the nearly same config in USB-mode.

If you are able, could you try the following:

  1. Install the rme.lua dissector from latest commit. I realized I had a bunch of changes in my local copy that hadn't been committed, which should enable the dissector to work for USB-mode without any wireshark patches. I also added the device ID for the 802.
  2. Set the 802 to USB-mode and disconnect it.
  3. Start a wireshark capture on XHC20 (make sure the interface is up, see https://wiki.wireshark.org/CaptureSetup/USB).
  4. Set the display filter to usb.endpoint_address.number == 12 || usb.endpoint_address.number == 13. This will display only packets to endpoints 12 and 13.
  5. Connect the 802 to your computer.
  6. If all goes well, you should see packets show up with the Register and Value fields added by the dissector. Hopefully, we can identify the registers that TotalMix sends.
  7. Stop the capture after about 5 seconds. You can save the captured packets to a pcapng file with File > Export Specified Packets, selecting all displayed packets.
huddx01 commented 6 months ago

@huddx01, since you seem to be familiar with iOS development: do you know if it's possible to log MIDI events to a device from another app on an iPad? I did look into this briefly, and came to the conclusion that it wasn't possible, but I could be wrong about this.

Sure!!! Why did i not came on this idea ;-) midilog_ipad

michaelforney commented 6 months ago

Thanks! Here we are seeing the 3F00 messages from the device, same as on linux. It is repeating 3F00 0919, which mean DSP version 9, DSP load 25.

What we need is to see the outgoing MIDI events from the TotalMix app to the 802. Is that possible?

huddx01 commented 6 months ago

Checkin that atm... How could i recognize, if the MIDI events are coming from the TM app? Looks like this is only from 802 to iPad...

The problem i have, is that if the logging app is running on iPad, and FF802 ist plugged in, the old iPad does not respond anymore for touches. But i am working on it if i could write the logs directly into a file while the logger app is in background...

log1.txt log2.txt

And yes, i activated some effects in TM to check if we see the dsp load

huddx01 commented 6 months ago

If you are able, could you try the following:

Install the rme.lua dissector from latest commit. I realized I had a bunch of changes in my local copy that hadn't been committed, which should enable the dissector to work for USB-mode without any wireshark patches. I also added the device ID for the 802. Set the 802 to USB-mode and disconnect it. Start a wireshark capture on XHC20 (make sure the interface is up, see https://wiki.wireshark.org/CaptureSetup/USB). Set the display filter to usb.endpoint_address.number == 12 || usb.endpoint_address.number == 13. This will display only packets to endpoints 12 and 13. Connect the 802 to your computer. If all goes well, you should see packets show up with the Register and Value fields added by the dissector. Hopefully, we can identify the registers that TotalMix sends. Stop the capture after about 5 seconds. You can save the captured packets to a pcapng file with File > Export Specified Packets, selecting all displayed packets.

@michaelforney sent you a mail to the mail address in your Github profile

michaelforney commented 6 months ago

Ok, made some big progress. I bought a raspberry pi 5 (previously I was borrowing a 4 from a friend), and got a hold of an iPad again. The same capture setup I used for the UCX II worked for the 802. A couple of things I discovered: setting the product string does seem to be necessary in order for the iPad TotalMix to detect the device. I think CoreMidi must cache the strings for a particular vendor:product ID, so that's why it worked with my UCX II even though I didn't set them the second time.

When TotalMix is trying to connect it sends

<- F0 00 20 0D 10 04 01 00 00 00 00 F7
skipping sysex with subid=4
<- F0 00 20 0D 10 00 00 00 00 69 0B 00 00 08 69 03 00 00 00 6A 0B 00 00 04 6A 03 01 00 08 6A 0B F7
[3D20]=0000
[3D22]=0000
[3D40]=0000
[3D41]=0000
[3D42]=0001
<- F0 00 20 0D 10 00 00 00 00 78 0B F7
[3F00]=0000
<- F0 00 20 0D 10 00 01 00 00 78 03 F7
[3F00]=0001
<- F0 00 20 0D 10 00 02 00 00 78 03 F7
[3F00]=0002
<- F0 00 20 0D 10 00 03 00 00 78 0B F7
[3F00]=0003
<- F0 00 20 0D 10 00 04 00 00 78 03 F7
...

Then, in a loop, I set it to cycle through all 60 channels, setting 3F02 (per-channel DSP overload).

while true; do
    for val in $(seq 0 59); do
        echo 3F02 "$(printf %.2XFF "$val")"
        sleep 0.05
    done
done | ./tools/regtool -w -s 24:1

This seems to be enough to get the iPad to detect my rpi as an 802 and connect. After this, I see it request the register dump with 3F99 0812. But even if I don't send anything new back, it shows as connected and I can interact with the controls and see what registers TotalMix sets.

I've started a register map for the 802 in the wiki: https://github.com/michaelforney/oscmix/wiki/802

Unfortunately, I have to return the iPad soon, so hopefully I can get most of it figured out before then.

michaelforney commented 6 months ago

I've mostly finished mapping out the 802 registers. Comparing to the dump @huddx01 provided, there are still a few unknowns, but nothing too major.

It would also be good to not get too far ahead of ourselves and do some sanity checks. I believe that AN 1 mute is at 1E02, and PH 9 mute is at 2602. You could try playing something out of AN 1 or PH 9, then try setting 1E02 or 2602 to 1 and 0. It should toggle the mute of the respective output.

huddx01 commented 6 months ago

0003 AN 1 ?
0004 AN 1 ? I think these might be the PH L and PH R Switches. Although the 802, UFX III and II same - is in mono for AN1 f. ex. - if i trigger just one phase via RME OSC to TM, i get answers from both:

SEND       | ENDPOINT(127.0.0.1:7001) ADDRESS(/2/phase) FLOAT(1)
RECEIVE    | ENDPOINT([::ffff:127.0.0.1]:51792) ADDRESS(/2/phaseRight) FLOAT(1)
RECEIVE    | ENDPOINT([::ffff:127.0.0.1]:51792) ADDRESS(/2/phase) FLOAT(1)

Sure, i will try and let you know what i could figure out.

huddx01 commented 6 months ago

speaker-test -c2 -Dplughw:CARD=F802xxxxxx,DEV=0 -r32000 Stream-Parameter sind 32000 Hz, S16_LE, 2 Kanäle Verwende 16 Oktaven rosa Rauschen Rate ist 32000 Hz (angefordert: 32000 Hz) Puffergröße von 8 bis 64000 Periodengröße von 4 bis 32000 Verwende maximale Puffergröße 64000 Perioden = 4 gesetzt: period_size = 16000 gesetzt: buffer_size = 64000 0 - Front Left 1 - Front Right

-> [3D21]=0005


speaker-test -c2 -Dplughw:CARD=F802xxxxxx,DEV=0 -r44100 Stream-Parameter sind 44100 Hz, S16_LE, 2 Kanäle Verwende 16 Oktaven rosa Rauschen Rate ist 44100 Hz (angefordert: 44100 Hz) Puffergröße von 22 bis 88200 Periodengröße von 11 bis 44100 Verwende maximale Puffergröße 88200 Perioden = 4 gesetzt: period_size = 22050 gesetzt: buffer_size = 88200 0 - Front Left 1 - Front Right

-> [3D21]=0001


speaker-test -c2 -Dplughw:CARD=F802xxxxxx,DEV=0 -r48000 Stream-Parameter sind 48000 Hz, S16_LE, 2 Kanäle Verwende 16 Oktaven rosa Rauschen Rate ist 48000 Hz (angefordert: 48000 Hz) Puffergröße von 22 bis 96000 Periodengröße von 11 bis 48000 Verwende maximale Puffergröße 96000 Perioden = 4 gesetzt: period_size = 24000 gesetzt: buffer_size = 96000 0 - Front Left 1 - Front Right

[3D21]=0002

.... so...

64000 -> [3D21]=0008 88200 -> [3D21]=0004 96000-> 0005 128000 -> 0005 176400 -> 0007 196000 -> 0008

looks strange, think because speaker-test has chosen S16_LE, 2 channels, as i did not clearly define it...?

michaelforney commented 6 months ago

Thanks, that seems to confirm that 3D21 is sample rate. It's expected that 32k, 64k, and 128k don't work in CC-mode: https://forum.rme-audio.de/viewtopic.php?id=37917

Ralf from RME sent me info about some of unknowns. Thank you! I've updated 802 doc accordingly.

huddx01 commented 6 months ago

Thanks for giving me the hints via irc. I tried to put it together, Some questions came up while trying to adapt the inputtree struct for the 802:

static const struct oscnode inputtree[] = {
    {"mute", 0x00, .set=setinputmute, .new=newbool},
    {"fx", 0x01, .set=setfixed, .new=newfixed, .min=-650, .max=0, .scale=0.1},
    {"stereo", 0x02, .set=setinputstereo, .new=newinputstereo},
    {"record", 0x03, .set=setbool, .new=newbool},
    {"playchan", 0x04, .set=setint, .new=newint, .min=1, .max=60},
    {"msproc", 0x05, .set=setbool, .new=newbool},
    {"phase", 0x06, .set=setbool, .new=newbool},
    {"gain", 0x07, .set=setinputgain, .new=newinputgain},

    /* 0x08 seems to be used for both - once level (for analog ins) and also 48v for mic (starting at ch9 in 802) */

    /* is level the dropdown menu for Analog Channels (1-8) - 0=+4dBu 1=Lo Gain ?*/
    {"level", 0x08, .set=setbool, .new=newbool},

    /* for Mic/Inst Channels (9-12) - 0=off 1=on ?*/
    /* if this is ok - either 48v or inst can be active. its a switch. sth like: "

      if (0x08 = true) {
            0x09 = false;  
       else {
            0x09 = true;
      }

      ### and the opposite...
      if (0x09 = true) {
            0x08 = false;  
       else {
            0x08 = true;
      }
    */

    {"48v", 0x08, .set=setbool, .new=newbool},
    {"inst", 0x09, .set=setbool, .new=newbool},

    /* not available for 802*/
    /*{"reflevel", 0x09, .set=setint, .new=newinput48v_reflevel},*/

    /* not available for 802*/
    /*{"autoset", 0x0a, .set=setbool, .new=newbool}, */ 

    /* what does hi-z mean?  is there any control for it in Totalmix? What control would that be for UCX II?*/
    /*{"hi-z", 0x0b, .set=setinputhiz, .new=newinputhiz},*/

    {"lowcut", 0x20, .set=setbool, .new=newbool, .child=lowcuttree},
    {"eq", 0x40, .set=setbool, .new=newbool, .child=eqtree},
    {"dynamics", 0x60, .set=setbool, .new=newbool, .child=dynamicstree},
    {"autolevel", 0x80, .set=setbool, .new=newbool, .child=autoleveltree},

    /* i do not remember any register for 802 where the channel names are sent back, so this would be the same here? */
    {"name", -1, .set=setinputname},
    {0},
};

Maybe you could correct the things, where i a am wrong?

huddx01 commented 6 months ago

Ok, most of my questions are clear now, by deeper looking into the contents from totalmix' xml/tmws files.

So, no need to explain the above.

michaelforney commented 6 months ago

@huddx01, can you check whether channel names are saved on the device? If you set a channel name on one computer, does that setting persist if you hook it up to another computer? I'm not seeing anything sent to the device when I change the channel name on the iPad (other devices do, but that may just because they have an LCD), so I think it might be part of the totalmix workspace only.

Another thing to test is level info. I believe this is triggered by sending a SysEx message with empty payload and sub ID 2, i.e. F0 00 20 0D 10 02 F7. Could you try sending that to your device with amidi -p hw:X,Y,Z -S 'F0 00 20 0D 10 02 F7' while running ./tools/regtool XX:YY | grep '^subid='? You should get a chunk of data back corresponding to channel levels. I expect the data format will be similar to https://github.com/michaelforney/oscmix/wiki/Protocol#levels. You could try playing a sine tone (I've been testing with play from sox) to a particular channel at some decibel level and see if the output matches your expectations.

I think I've pretty much finished with the 802 document in the wiki. Still unknown are 1EA0-1EB7, 1EC0-1EC3, and 1EFE-1EFF for output 1, as well as the corresponding ranges for outputs 2-30. But, I think these are probably fine to ignore for now.

Next thing I'll work on is making a device abstraction for oscmix so it can support multiple devices, and then we can add support for new devices based on the doc.

huddx01 commented 6 months ago

@huddx01, can you check whether channel names are saved on the device? If you set a channel name on one computer, does that setting persist if you hook it up to another computer? I'm not seeing anything sent to the device when I change the channel name on the iPad (other devices do, but that may just because they have an LCD), so I think it might be part of the totalmix workspace only.

@michaelforney, i can confirm: No channel names are stored in the device. I did it this way:

i also tried this by storing the curr state into device (all 6 slots) before unplugging. same - it seems not to store its names.


While channel mutes of the INs and OUTs are stored - but Playbacks never save anything. As MC tells in this post: https://forum.rme-audio.de/viewtopic.php?pid=214870#p214870


Another thing to test is level info. I believe this is triggered by sending a SysEx message with empty payload and sub ID 2, i.e. F0 00 20 0D 10 02 F7. Could you try sending that to your device with amidi -p hw:X,Y,Z -S 'F0 00 20 0D 10 02 F7' while running ./tools/regtool XX:YY | grep '^subid='? You should get a chunk of data back corresponding to channel levels. I expect the data format will be similar to https://github.com/michaelforney/oscmix/wiki/Protocol#levels. You could try playing a sine tone (I've been testing with play from sox) to a particular channel at some decibel level and see if the output matches your expectations.

I did it via: speaker-test -c6 -Dplughw:CARD=F802xxxxxxxxx,DEV=0 while running the speaker-test, i triggered the subid2 sysex via amidi multiple times. here the result:

level_test.txt

I think I've pretty much finished with the 802 document in the wiki. Still unknown are 1EA0-1EB7, 1EC0-1EC3, and 1EFE-1EFF for output 1, as well as the corresponding ranges for outputs 2-30. But, I think these are probably fine to ignore for now.

Next thing I'll work on is making a device abstraction for oscmix so it can support multiple devices, and then we can add support for new devices based on the doc.

Thanks! I am sure we will find the unknown registers, too. Looking forward to be able to test, No problem if it will not cover full possibilities, or has some bugs.

huddx01 commented 5 months ago

First success about the ff802 ;-)

ff802_oscmixweb

Sojuzstudio commented 5 months ago

Great! How can i test that? Oh, if only UFX+ could also work..

huddx01 commented 5 months ago

It are just some first steps.

@michaelforney started the basic abstraction here: https://github.com/michaelforney/oscmix/commit/9cd349c50c52519f97cfb0c235b50068f523163b The further goal is to make oscmix flexible for easy adapting other devices. So you would need just a kind of device specific register-mapping somewhere. I am sure, the UFX+ will be possible to implement, too.

So i just implemented a few registers, see https://github.com/michaelforney/oscmix/wiki/802 Just to learn and see if it works. But its far away from being usable/stable for now.

I prepared the fork https://github.com/huddx01/oscmix/tree/dev-ff802 for that. But wanted to wait before pushing the state until its usable. If you are interested i can commit my current state there. Makes sense if you want to develop/contribute to @michaelforney 's really awesome project.

huddx01 commented 4 months ago

gtk

gtk build on Mac: levels seem to work. Check the dev-generic branch, regarding the FF802 here: https://github.com/huddx01/oscmix/tree/dev-generic

Sojuzstudio commented 4 months ago

Any advice on how to get this installed on my machine so I can test? I use AvLinux MXe latest version

huddx01 commented 4 months ago

Should be possible to compile for you. you need oscmix, alsaseqio or alsarowio. and the gtk ui. I modified some gtk stuff due to the channels for ff802. ping me via irc oscmix channel, if you got any problems. I should also mention, this is far away from being stable for now.

Sojuzstudio commented 3 months ago

I tried to test. I can't install

sojuzstudio@sojuzstudio-System-Product-Name:~/Lataukset/oscmix-main$ sudo make [sudo] sojuzstudio-käyttäjän salasana: cc -std=c11 -O1 -c -o oscmix.o oscmix.c In file included from oscmix.c:15: sysex.h: In function ‘getle32_7bit’: sysex.h:36:34: error: ‘reinterpret_cast’ undeclared (first use in this function) 36 | const unsigned char b = reinterpret_cast<const unsigned char >(p); | ^~~~ sysex.h:36:34: note: each undeclared identifier is reported only once for each function it appears in sysex.h:36:51: error: expected expression before ‘const’ 36 | const unsigned char b = reinterpret_cast<const unsigned char >(p); | ^~~~~ sysex.h: In function ‘putle32_7bit’: sysex.h:51:28: error: ‘reinterpret_cast’ undeclared (first use in this function) 51 | unsigned char b = reinterpret_cast<unsigned char >(p); | ^~~~ sysex.h:51:45: error: expected expression before ‘unsigned’ 51 | unsigned char b = reinterpret_cast<unsigned char >(p); | ^~~~ make: *** [<sisäänrakennettu>: oscmix.o] Virhe 1 sojuzstudio@sojuzstudio-System-Product-Name:~/Lataukset/oscmix-main$

huddx01 commented 3 months ago

It seems you checked out and tried to compile the main branch? But anyway, this should compile...

If you want to test it for ff802 - i checked in the latest WIP state in generic-ff802 in my fork.

Anyhow, i think it would make sense to assist you side by side. If you want, let me know when we could try this out together.

Sojuzstudio commented 3 months ago

Could it be due to the fact that I am using the Finnish-language Ubuntu studio 24.04?

huddx01 commented 3 months ago

No, the system language should not affecting this.

Sorry, i led you to the wrong tree in my last post.

Please check out this branch (its my last wip state for ff802): https://github.com/huddx01/oscmix/tree/dev-generic

I should also mention, that i developed (and compiled) it on Mac. And i had to use c++ due to several reasons. The "reinterpret_cast<unsigned char *>(p)" tells me that this has to do with it. Let me check this on a linux system.

I will let you know here .

huddx01 commented 3 months ago

OK, i edited the Makefile and device.h... It compiles without problems on my debian vm now:

meg33@debianvm:~/Projects/oscmix-dev-generic$ make
cc -std=c11 -O1   -c -o main.o main.c
cc -std=c11 -O1   -c -o osc.o osc.c
cc -std=c11 -O1   -c -o oscmix.o oscmix.c
cc -std=c11 -O1   -c -o socket.o socket.c
cc -std=c11 -O1   -c -o sysex.o sysex.c
cc -std=c11 -O1   -c -o util.o util.c
cc -std=c11 -O1   -c -o device_ffucxii.o device_ffucxii.c
cc -std=c11 -O1   -c -o device_ff802.o device_ff802.c
cc -std=c11  -o oscmix main.o osc.o oscmix.o socket.o sysex.o util.o device_ffucxii.o  device_ff802.o -l pthread -l m
cc -std=c11 -O1   -c -o alsarawio.o alsarawio.c
cc -std=c11  -o alsarawio alsarawio.o
cc -std=c11  -O1 $(pkg-config --cflags alsa) -c -o alsaseqio.o alsaseqio.c
cc -std=c11  $(pkg-config --libs-only-L --libs-only-other alsa) -o alsaseqio alsaseqio.o $(pkg-config --libs-only-l alsa) -l pthread
make -C gtk
make[1]: Verzeichnis ~/Projects/oscmix-dev-generic/gtk wird betreten
c99 -O1 -Wno-overlength-strings $(pkg-config --cflags --cflags gtk+-3.0)   -c -o main.o main.c
c99 -O1 -Wno-overlength-strings $(pkg-config --cflags --cflags gtk+-3.0)   -c -o mixer.o mixer.c
c99 -O1 -Wno-overlength-strings $(pkg-config --cflags --cflags gtk+-3.0)   -c -o channel.o channel.c
c99 -O1 -Wno-overlength-strings $(pkg-config --cflags --cflags gtk+-3.0)   -c -o eqplot.o eqplot.c
c99 -O1 -Wno-overlength-strings $(pkg-config --cflags --cflags gtk+-3.0)   -c -o scaleentry.o scaleentry.c
glib-compile-resources --generate-source resources.xml
c99 -O1 -Wno-overlength-strings $(pkg-config --cflags --cflags gtk+-3.0)   -c -o resources.o resources.c
c99 $(pkg-config --libs-only-L --libs-only-other gtk+-3.0) -o oscmix-gtk main.o mixer.o channel.o eqplot.o scaleentry.o resources.o ../osc.o $(pkg-config --libs-only-l gtk+-3.0) -l m
glib-compile-schemas .
make[1]: Verzeichnis  ~/Projects/oscmix-dev-generic/gtk wird verlassen

Just updated the repo:. Here the zip with all content: https://github.com/huddx01/oscmix/archive/refs/heads/dev-generic.zip

I should mention, that i just compiled the stuff for now. Had no time to test it for now.

Let me know, if you need further help.

Sojuzstudio commented 3 months ago

I got it complied now, I think. But when I follow the instructions and >> alsarawio 2,0,1 oscmix (I changed the right ports "amidi -l") alsarawio: command not found

If you can advise a little further...