mungewell / zoom-zt2

Python script to install/remove effects from the Zoom G1Four pedal
MIT License
59 stars 10 forks source link

Figure out how to read effect (and other) parameters directly. #16

Open mungewell opened 3 years ago

mungewell commented 3 years ago

@shooking

We know how to write individual parameters to device (including directly to FX), can we figure out how to read in the same manner?

$ amidi -p hw:1,0,0 -S 'f0 52 00 6e 64 03 00 01  02 3d 17 00 00 00 f7'
                                                    ^^ ^^ value lo/hi
                                                 ^^ param
                                             ^^ slot
param 0: effect on/off
param 1: effect type
param 2: dial 1 (left most)
param 3: dial 2
param 4: dial 3
param 5: dial 4 (right most)
mungewell commented 3 years ago

From notes I made a long time ago (and have mostly forgotten).

Set Master Volume
$ amidi -p hw:1,0,0 -S 'f0 52 00 6e 64 03 00 0a 00 20 00 00 00 00 f7'
                                                   ^^
                                                   ++---- Volume

and

Appears to be contrast...
$ amidi -p hw:1,0,0 -S 'f0 52 00 6e 56 00 0a f7'  -r temp.bin -t 1 ; hexdump -C temp.bin
                                          ^^ Contrast

7 bytes read
00000000  f0 52 00 6e 00 0d f7                              |.R.n...|
00000007

Wondering if that 2nd command is actually missing bytes... and reading contrast by default.

shooking commented 3 years ago

Yes this is what I was musing earlier. For longest sysex request I seem in 15. Typical is 8. I have some 12 ....which makes me think is should be 15.

You confirm it wasn't poking around with sysex that cause your display - and other than that your pedal is working

Given I have the (g|b)X1 four and it looks like it is possible to interchange the FX I will be a bit more aggressive.

I notice the pedal can crash. I was thinking of putting a relay or something to physically switch the unit on/off them write some brute force wait 2 seconds, if nothing comes back then cycles the unit and move to next sequence.

I am glad I started using the Pi because this lives in main house - warm. My windoze PC lives in garage -tad cold in UK. But the Guitar Lab runs on that.

I see this tonelib looks interest - I wonder.if the dev.would port it to Pi?

Majority of pedal now appears externally controllable via midi and hence Ctrlr - should be cool on Pi4.

Great stuff you have done here.

On Fri, 11 Dec 2020 22:16 mungewell, notifications@github.com wrote:

From notes I made a long time ago (and have mostly forgotten).

Set Master Volume $ amidi -p hw:1,0,0 -S 'f0 52 00 6e 64 03 00 0a 00 20 00 00 00 00 f7' ^^ ++---- Volume

and

Appears to be contrast... $ amidi -p hw:1,0,0 -S 'f0 52 00 6e 56 00 0a f7' -r temp.bin -t 1 ; hexdump -C temp.bin ^^ Contrast

7 bytes read 00000000 f0 52 00 6e 00 0d f7 |.R.n...| 00000007

Wondering if that 2nd command is actually missing bytes... and reading contrast by default.

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/mungewell/zoom-zt2/issues/16#issuecomment-743455862, or unsubscribe https://github.com/notifications/unsubscribe-auth/AFO7EVYNSQEZ3Y45MVFG5RDSUKK3HANCNFSM4UXKHJMQ .

mungewell commented 3 years ago

Confirmed that we can directly change the parameters on the 2nd page of a 'large' effect.

$ amidi -p hw:1,0,0 -S 'F0 52 00 6e 64 02 01 02 00 F7' -r temp.bin -t 1
343 bytes read
$ python3 decode_screens.py temp.bin
---
Effect: MS 800 (On)
Input : LO
Bass : 52
MID : 48
Treble : 70
PRSNC : 60
Gain : 75
VOL : 48

$ amidi -p hw:1,0,0 -S 'f0 52 00 6e 64 03 00 01  08 40 00 00 00 00 f7'
$ amidi -p hw:1,0,0 -S 'F0 52 00 6e 64 02 01 02 00 F7' -r temp.bin -t 1
343 bytes read
$ python3 decode_screens.py temp.bin
---
Effect: MS 800 (On)
Input : LO
Bass : 52
MID : 48
Treble : 70
PRSNC : 60
Gain : 75
VOL : 64
shooking commented 3 years ago

Thanks - I was already there - the parts I haven't squared in my mind yet is how to get list of FX and then how to set them for a patch.

My aim is to get this into Ctrlr panel. It likes to know core sysex, their parameters. And some combo lists. I know how to create these dynamically in Ctrlr - but not currently how to get this from pedal.

Miniak was a real PITA but then I reverse engineered this TableOfContents sysex. And that was a game changer.

We know how to ask menu of patches. I dont know how to get menu of FX. I know if an FX is deleted from pedal that factory reset DOES NOT restore missing FX. So to me there is a semi ToC on the pedal - so would be better to just ask it "which FX you have at what index?". It looks like if one can know the core filename it might be possible to have initial guesses for FX paraterm, bias, range and values

On Mon, 14 Dec 2020, 03:08 mungewell, notifications@github.com wrote:

Confirmed that we can directly change the parameters on the 2nd page of a 'large' effect.

$ amidi -p hw:1,0,0 -S 'F0 52 00 6e 64 02 01 02 00 F7' -r temp.bin -t 1 343 bytes read $ python3 decode_screens.py temp.bin

Effect: MS 800 (On) Input : LO Bass : 52 MID : 48 Treble : 70 PRSNC : 60 Gain : 75 VOL : 48

$ amidi -p hw:1,0,0 -S 'f0 52 00 6e 64 03 00 01 08 40 00 00 00 00 f7' $ amidi -p hw:1,0,0 -S 'F0 52 00 6e 64 02 01 02 00 F7' -r temp.bin -t 1 343 bytes read $ python3 decode_screens.py temp.bin

Effect: MS 800 (On) Input : LO Bass : 52 MID : 48 Treble : 70 PRSNC : 60 Gain : 75 VOL : 64

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/mungewell/zoom-zt2/issues/16#issuecomment-744137214, or unsubscribe https://github.com/notifications/unsubscribe-auth/AFO7EV75FFHGJTRZIVJIPGTSUV6TNANCNFSM4UXKHJMQ .

mungewell commented 3 years ago

@shooking I think that you are forgetting the "raison d'être" for this project.

The 'FLST_SEQ.ZT2' file contains a list of which effects are installed on the pedal and does some grouping/ordering of how they are displayed in the menus. Originally this file was worked by editing the FW, but on the G1Four that did not work and we discovered it can be accessed via Midi - which is how this project adds effects (and uploads the effect binary too).

Each effect as an 'id' which is how Zoom identifies them. This is stored in the '.ZT2', as well as the effect binary '.ZD2'. https://github.com/mungewell/zoom-zt2/blob/master/zoomzt2.py#L25 https://github.com/mungewell/zoom-zt2/blob/master/zoomzt2.py#L66

You are correct that the 'files' seen in the FW do not necessarily reflect the current status of the pedal. It seems that this information remains as-is despite factory resets. We also noted that the FW v2.00 for the B1Four actually includes the Guitar effects... roll eyes.

I don't know how to get menu of FX...

$ python3 zoomzt2.py -R -w my_pedal.zt2

The '-d' (--dump) or '-s' (--summary) flags will show the ZT2 contents as readable ASCII.

shooking commented 3 years ago

Cool. So on my Raspberry Pi4 I am not able to get the python to work. pi@raspberrypi:~/Software/zoom-zt2 $ amidi -p hw:2,0,0 -S 'F0 52 00 6e 64 02 01 02 00 F7' -r temp.bin -t 1

343 bytes read pi@raspberrypi:~/Software/zoom-zt2 $ python3 decode_screens.py temp.bin Traceback (most recent call last): File "decode_screens.py", line 28, in "type1" / Embedded(Type), NameError: name 'Embedded' is not defined

I see that this project uses construct. I dont seem able to construct the construct :-(

Out of interest - I was trying to decode the strings you use to grab the table of contents. I found similar sysex in PCMODE when I decoded the pedal traffic captured in Zoom GuitarLab when in PCMODE.

I was commenting it for my own benefit export MIDI_DEV=amidi -l | grep ZOOM | awk '{print $2}' -- turn editor mode on amidi -p ${MIDIDEV} -S "f0 52 00 6e 52 f7" -r temp.bin -t 1 ; hexdump -C temp.b in ` -- F L S T S E Q . Z T 2

-- send A0 amidi -p ${MIDI_DEV} -S "f0 52 00 6e 60 25 00 00 46 4c 53 54 5f 53 45 51 2e 5a 54 32 00 05 f7" -r temp.bin -t 1 ; hexdump -C temp.bin -- effectively 04, 17[23] 36[54] 42[66] (h) which is 6 B in chars -- send A1 amidi -p ${MIDI_DEV} -S "f0 52 00 6e 60 05 00 f7" -r temp.bin -t 1 ; hexdump -C temp.bin -- send C1 amidi -p ${MIDIDEV} -S "f0 52 00 6e 60 27 f7" -r temp.bin -t 1 ; hexdump -C tem p.bin -- F L S T S E Q . Z T 2 -- send f(A0) amidi -p ${MIDI_DEV} -S "f0 52 00 6e 60 20 02 00 00 00 00 00 00 00 00 00 46 4c 5 3 54 5f 53 45 51 2e 5a 54 32 00 f7" -r temp.bin -t 1 ; hexdump -C temp.bin

-- 16 repeats ops A1 A2 A1 -- part 1 - start of FLTS_SEQ in 7Byte->6Byte encoding amidi -p ${MIDI_DEV} -S "f0 52 00 6e 60 05 00 f7" -r temp.bin -t 1 ; hexdump -C temp.bin amidi -p ${MIDI_DEV} -S "f0 52 00 6e 60 22 14 2f 60 00 0c 00 04 00 00 00 f7" -r temp.bin -t 1 ; hexdump -C temp.bin amidi -p ${MIDI_DEV} -S "f0 52 00 6e 60 05 00 f7" -r part1.bin -t 1 ; hexdump -C part1.bin `

I got curious - so do you know what "f0 52 00 6e 60 05 00 f7" means (lets call this A1) Then f0 52 00 6e 60 22 14 2f 60 00 0c 00 04 00 00 00 f7 (A2 say)

The first sequence seems to be saying "hey Zoom ... give me handle on FLST_SEQ.ZT2

So I wondered if you have tried this on the GUARD theCMD=60; amidi -p ${MIDI_DEV} -S "F0 52 00 6e ${theCMD} 25 00 00 47 55 41 52 44 5a 44 4c 2e 5a 54 32 00 05 f7" -r t1.bin -t 1; hexdump -C t1.bin

This returns

41 bytes read 00000000 f0 52 00 6e 60 04 25 00 00 17 00 00 00 00 00 47 |.R.n`.%........G| 00000010 55 41 52 44 5a 44 4c 2e 5a 54 32 00 00 00 10 08 |UARDZDL.ZT2.....| 00000020 00 00 00 00 00 00 00 00 f7 |.........| 00000029

cf pi@raspberrypi:~/Software/ZoomPedal $ amidi -p ${MIDI_DEV} -S "f0 52 00 6e 60 25 00 00 46 4c 53 54 5f 53 45 51 2e 5a 54 32 00 05 f7" -r temp.bin -t 1 ; hexdump -C temp.bin

41 bytes read 00000000 f0 52 00 6e 60 04 25 00 00 17 00 00 00 00 00 46 |.R.n`.%........F| 00000010 4c 53 54 5f 53 45 51 2e 5a 54 32 00 00 00 36 42 |LST_SEQ.ZT2...6B| 00000020 00 00 00 00 00 00 00 00 f7 |.........| 00000029

The primary difference is GUARD has a 10 08 cf FLST_SEQ.ZT2 with 36 42. Some for of lengths? Or some offset into the "file"?

shooking commented 3 years ago

Having read you Python some more I can see you already know it is possible to probe via PC Mode for device contents of ZT2 file. The kinky part was (for me at least) discovering it returns the size of the file .. then some potential overhead for f0 preamble and one can know how many passes to request data.

Now I try to get that construct working - maybe I should try on Ubuntu rather than Raspberry Pi. Formatting is message up because I use grave operator in Unix and this is also the code begin/end char.

I was trying to read you code to work out how you get the ZD2 info - I can see how the ZT2 is gathered and looking in the windows binary there are two. So these can be grabbed. Hopefully when I get Construct working and stick Pycharm on it I can begin to see how the code works.

mungewell commented 3 years ago

Can you please fix the highlight (make things blocks of code so that GitHub doesn't assume headings/etc).

Construct changed their way of formatting Struct block around rev 2.8, you might need to rebuild that module from source. Simon.

mungewell commented 3 years ago

Now I am guessing there is a way to read the ZD2 files.

My Python module includes some basic parsing but does not implement a command line. The GUI version uses this to print pretty information when you select new effect binaries to upload, and to make sure that they go into the correct group in FLST_SEQ.

mungewell commented 3 years ago

Now I am guessing there is a way to read the ZD2 files.

All files are read the same way, you can even do some wildcard operations. https://github.com/mungewell/zoom-zt2/blob/master/zoomzt2.py#L261

Note: If you upload the same file name multiple times you end up with duplicates, each of which deleted individually... had a script go wrong when I was playing.

shooking commented 3 years ago

So now I made an accident. Am I reading the available FX from my pedal?

I send from a fresh reboot probeString="F0 52 00 6E 64 05 F7" to an empty patch (initially on bypass).

And it seems to progressively cycle thru the available effects. I still not able to get your program working to check if this is following my SEQ ZT2

It also doesnt quite enable the effect properly (leaves it in some "inverse" mode). But I can eventually delete the thing off.

Ex amidi -p ${MIDI_DEV} -S "f0 52 00 6e 64 02 00 09 00 f7" -r t1.bin -t 1; hexdump -C t1.bin; rm t1.bin tells me I am in all bypass and off. So now I start sending seqeunce of 64 05's. 49 bytes read 00000000 f0 52 00 6e 64 06 42 59 50 41 53 53 2e 5a 44 32 |.R.nd.BYPASS.ZD2| 00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000020 00 00 00 00 02 01 00 00 00 00 00 00 00 00 00 00 |................| 00000030 f7 |.| 00000031 hit 64 05 again 93 bytes read 00000000 f0 52 00 6e 64 06 43 4f 4d 50 2e 5a 44 32 00 00 |.R.nd.COMP.ZD2..| 00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000020 00 00 00 00 06 01 00 00 00 00 00 00 00 00 00 00 |................| 00000030 0a 00 06 00 00 00 10 00 00 00 00 01 00 00 00 00 |................| 00000040 00 00 00 00 00 00 0a 00 06 00 00 00 00 00 00 00 |................| 00000050 00 64 00 50 00 00 00 16 00 00 00 00 f7 |.d.P.........| 0000005d keep going with this... RACKCOMP.ZD2 SLWATK.ZD2 ZNR.ZD2

OK so consulting your g1_everything

pi@raspberrypi:~/Software/zoom-zt2/scripts $ strings G1_everything.zt2 BYPASS.ZD2 COMP.ZD2 1.20 RACKCOMP.ZD2 1.20 SLWATK.ZD2 1.30 ZNR.ZD2 1.30 MUTESW.ZD2 1.20 GRAYCOMP.ZD2 1.20 N_GATE.ZD2 1.20 OPTCOMP.ZD2 1.30 BLACKOPT.ZD2 1.20 LMT1176.ZD2 1.30 160_COMP.ZD2 1.20 DUAL_CMP.ZD2 1.20

perhaps I predict the next one is MUTESW? Nope I got LMT1176.ZD2 ...

Do you already know about this ZD2 iterator? So far it is only setting FX slot 0 - my guess is I am not sending sufficient params.

This is what I get out until end of iterator

pi@raspberrypi:~/Software/ZoomPedal $ strings zd2_dump.bin BYPASS.ZD2 COMP.ZD2 RACKCOMP.ZD2 SLWATK.ZD2 ZNR.ZD2 LMT1176.ZD2 AUTOWAH.ZD2 SEQFLTR.ZD2 GTGEQ71U.ZD2 PARAEQ.ZD2 RNDMFLTR.ZD2 TS_DRIVE.ZD2 EP_STOMP.ZD2 RCBOOST.ZD2 GOLD_DRV.ZD2 SWEETDRV.ZD2 DYNDRIVE.ZD2 REDCRUNC.ZD2 ACOSIM.ZD2 NYC_MUFF.ZD2 BGTHRTTL.ZD2 DIST_1.ZD2 SQUEAK.ZD2 DISTPLUS.ZD2 ZEN_DRV.ZD2 VIOLETDS.ZD2 MS800_1U.ZD2 MS19591U.ZD2 FD_TWR1U.ZD2 FDBMAN1U.ZD2 FDDLXR1U.ZD2 UK30A_1U.ZD2 BGMK1_1U.ZD2 XTSBLU1U.ZD2 HW100_1U.ZD2 RCTORG1U.ZD2 ORG1201U.ZD2 DZ_DRV1U.ZD2 MACH301U.ZD2 MS4X12.ZD2 MS4X12GB.ZD2 FD2X12.ZD2 FDB4X10.ZD2 FDDX1X12.ZD2 UK2X12.ZD2 MK1_1X12.ZD2 MK3_1X12.ZD2 BGN4X12.ZD2 HW4X12.ZD2 RCT4X12.ZD2 ORG_4X12.ZD2 DZ4X12F.ZD2 MA2X12.ZD2 TREMOLO.ZD2 STEREOCH.ZD2 PHASER.ZD2 VINFLNGR.ZD2 VIBRATO.ZD2 OCTAVE.ZD2 PITCHSHF.ZD2 HPS.ZD2 CLONECHO.ZD2 CRNTRI3S.ZD2 BOMBER.ZD2 DELAY_3S.ZD2 ANDLY_3S.ZD2 TAPEECHO.ZD2 RVRSDL3S.ZD2 MODDELAY.ZD2 PPDLY_3S.ZD2 SOFTEC3S.ZD2 ROOM.ZD2 HALL.ZD2 HD_HALL.ZD2 SPRING.ZD2 FDSPRING.ZD2 PLATEREV.ZD2 PDL_VOL.ZD2 BLCK_WAH.ZD2 PDL_PIT.ZD2 PDL_VIBE.ZD2 PDL_PHA.ZD2 PDLDLY3S.ZD2 PDL_REV.ZD2 OUT_VP.ZD2

I just verified manually this is the order of FX I can choose for slot 1 of an empty preset. Actually it is all I can select in any of the slots ... so I have more cruft on my pedal than I can use?? No wonder there is none left.

You mentioned it is possible to pull the contents of the files. I tried to read hall.zd2 (attached) but I have no idea what I am looking at to verify if I read it right. hall.txt

Attaching binary dump you recognise slots IDs or other useful info. zd2_dump.txt

Not sure if there is anything useful in here. To me it is because it allows me to enumerate current content of the FX on the pedal (and I can already read current patch content).

Is it that the FLTS_SEQ is the total set of FX, and this method is the current "available for selection in an FX"? Would be odd - more cruft than I can select.

mungewell commented 3 years ago

For your 'Hall' question - I think that you are not doing 7bit -> 8bit unpacking, nor stripping SysEx header, checksum, and terminator... all this is shown here in the code. https://github.com/mungewell/zoom-zt2/blob/master/zoomzt2.py#L284

$ hexdump -C ~/Downloads/hall.txt | head
00000000  f0 52 00 6e 60 04 22 01  00 00 04 00 5a 44 4c 46  |.R.n`.".....ZDLF|
00000010  78 00 00 30 00 1a 50 49  76 07 00 00 00 00 01 00  |x..0..PIv.......|
00000020  01 00 01 08 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000030  00 00 00 02 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000040  00 00 00 00 00 00 00 00  00 00 00 40 00 00 00 00  |...........@....|
00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000070  01 31 2e 00 35 30 00 00  09 30 00 00 00 09 48 61  |.1..50...0....Ha|
00000080  6c 6c 00 00 00 00 00 5e  27 0d 52 00 45 56 45 52  |ll.....^'.R.EVER|
00000090  42 00 00 44 32 27 31 1b  18 50 00 01 00 00 49 43  |B..D2'1..P....IC|

$ hexdump -C /media/simon/OS/Users/simon/Documents/ZoomFW/B1_FOUR_v2.00/zd2/HALL.ZD2 | head
00000000  5a 44 4c 46 78 00 00 00  b7 97 5d bc 03 00 00 00  |ZDLFx.....].....|
00000010  01 00 00 00 01 00 00 00  80 00 00 00 00 00 00 00  |................|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000030  00 00 00 00 00 00 00 00  80 00 00 00 00 00 00 00  |................|
00000040  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000050  00 00 00 00 00 00 00 00  01 31 2e 33 30 00 00 09  |.........1.30...|
00000060  30 00 00 09 48 61 6c 6c  00 52 00 03 c3 66 09 52  |0...Hall.R...f.R|
00000070  45 56 45 52 42 00 03 db  66 61 1b 98 50 00 00 00  |EVERB...fa..P...|
00000080  49 43 4f 4e b6 00 00 00  42 4d b6 00 00 00 00 00  |ICON....BM......|
00000090  00 00 3e 00 00 00 28 00  00 00 17 00 00 00 1e 00  |..>...(.........|
mungewell commented 3 years ago

The 'everything' example is just a pre-compiled ZT2 listing effects from the F/W image, it can be decoded to text with

$ python3 ../zoomzt2.py -s G1_everything.zt2 > G1_everything.txt G1_everything.txt

Zoom (inadvertently published a full list of the effects here: https://www.zoom.co.jp/archive/ZDLM/AllZDL3.lst

mungewell commented 3 years ago

The command you suggested reads once, and then pedal (G1Four v2.00) has crashed and doesn't respond again until power cycled.

$ amidi -p hw:2,0,0 -S "F0 52 00 6E 64 05 F7" -r temp.bin -t 1 ; hexdump -C temp.bin
49 bytes read
00000000  f0 52 00 6e 64 06 42 59  50 41 53 53 2e 5a 44 32  |.R.nd.BYPASS.ZD2|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000020  00 00 00 00 02 01 00 00  00 00 00 00 00 00 00 00  |................|
00000030  f7                                                |.|
00000031

$ amidi -p hw:2,0,0 -S "F0 52 00 6E 64 05 F7" -r temp.bin -t 1 ; hexdump -C temp.bin
0 bytes read

$ amidi -p hw:2,0,0 -S "F0 52 00 6E 64 05 F7" -r temp.bin -t 1 ; hexdump -C temp.bin
0 bytes read
shooking commented 3 years ago

The command you suggested reads once, and then pedal (G1Four v2.00) has crashed and doesn't respond again until power cycled.

$ amidi -p hw:2,0,0 -S "F0 52 00 6E 64 05 F7" -r temp.bin -t 1 ; hexdump -C temp.bin
49 bytes read
00000000  f0 52 00 6e 64 06 42 59  50 41 53 53 2e 5a 44 32  |.R.nd.BYPASS.ZD2|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000020  00 00 00 00 02 01 00 00  00 00 00 00 00 00 00 00  |................|
00000030  f7                                                |.|
00000031

$ amidi -p hw:2,0,0 -S "F0 52 00 6E 64 05 F7" -r temp.bin -t 1 ; hexdump -C temp.bin
0 bytes read

$ amidi -p hw:2,0,0 -S "F0 52 00 6E 64 05 F7" -r temp.bin -t 1 ; hexdump -C temp.bin
0 bytes read

Well I did say I send from a fresh reboot probeString="F0 52 00 6E 64 05 F7" to an empty patch (initially on bypass).

And under those circumstances for sure it works. I can delete such an FX but it isnt usable - I was hoping somehow the operation reveals the FX ID and Group ID, then I can use this to find the current sequence of FX, their ID and Group ID, so I can then use your "set FX" midi strings.

shooking commented 3 years ago

For your 'Hall' question - I think that you are not doing 7bit -> 8bit unpacking, nor stripping SysEx header, checksum, and terminator... all this is shown here in the code. https://github.com/mungewell/zoom-zt2/blob/master/zoomzt2.py#L284

$ hexdump -C ~/Downloads/hall.txt | head
00000000  f0 52 00 6e 60 04 22 01  00 00 04 00 5a 44 4c 46  |.R.n`.".....ZDLF|
00000010  78 00 00 30 00 1a 50 49  76 07 00 00 00 00 01 00  |x..0..PIv.......|
00000020  01 00 01 08 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000030  00 00 00 02 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000040  00 00 00 00 00 00 00 00  00 00 00 40 00 00 00 00  |...........@....|
00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000070  01 31 2e 00 35 30 00 00  09 30 00 00 00 09 48 61  |.1..50...0....Ha|
00000080  6c 6c 00 00 00 00 00 5e  27 0d 52 00 45 56 45 52  |ll.....^'.R.EVER|
00000090  42 00 00 44 32 27 31 1b  18 50 00 01 00 00 49 43  |B..D2'1..P....IC|

$ hexdump -C /media/simon/OS/Users/simon/Documents/ZoomFW/B1_FOUR_v2.00/zd2/HALL.ZD2 | head
00000000  5a 44 4c 46 78 00 00 00  b7 97 5d bc 03 00 00 00  |ZDLFx.....].....|
00000010  01 00 00 00 01 00 00 00  80 00 00 00 00 00 00 00  |................|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000030  00 00 00 00 00 00 00 00  80 00 00 00 00 00 00 00  |................|
00000040  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000050  00 00 00 00 00 00 00 00  01 31 2e 33 30 00 00 09  |.........1.30...|
00000060  30 00 00 09 48 61 6c 6c  00 52 00 03 c3 66 09 52  |0...Hall.R...f.R|
00000070  45 56 45 52 42 00 03 db  66 61 1b 98 50 00 00 00  |EVERB...fa..P...|
00000080  49 43 4f 4e b6 00 00 00  42 4d b6 00 00 00 00 00  |ICON....BM......|
00000090  00 00 3e 00 00 00 28 00  00 00 17 00 00 00 1e 00  |..>...(.........|

For sure I am not processing the content yet. Thanks for the comparison dump. I was just hoping to get the FX ID and Group ID for use in your cool "set slot M to FX ID, Group ID".

Because at that point I can 1 - probe patches

Having said all this - I am not sure I would ever gig with the above - dont want someone spilling beer all over my 21.5" touch screen - and that's just me :-)

shooking commented 3 years ago

The 'everything' example is just a pre-compiled ZT2 listing effects from the F/W image, it can be decoded to text with

$ python3 ../zoomzt2.py -s G1_everything.zt2 > G1_everything.txt G1_everything.txt

Zoom (inadvertently published a full list of the effects here: https://www.zoom.co.jp/archive/ZDLM/AllZDL3.lst

I feel like a fool ... cd construct-2.10.56/ sudo python3 setup.py install python3 ../zoomzt2.py -s G1_everything.zt2 > pants.txt My problem(s), other than being stupid was 1] always approach coding with alcohol! 2] if you sudo install python3 .. darn well continue using python3!!

so I can run your excellent code now thanks. Sorry for the dofus questions.

I think I will compile this on Ubuntu and use code debugger, or PyCharm, so I can get to grips with what you did.

Thanks again for your patient explanations.