Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support for Alesis Andromeda A6 #62

Open
christofmuc opened this issue Jan 4, 2021 · 65 comments
Open

Support for Alesis Andromeda A6 #62

christofmuc opened this issue Jan 4, 2021 · 65 comments

Comments

@christofmuc
Copy link
Owner

Given that this device seems so tricky, I made an adaption as an exercise. The most ugly thing was its 8 bit storage format involving lots of bit shifts, the rest seems to be fairly normal.

@markusschloesser Do you want to give it a try?
AlesisAndromedaA6.zip

@markusschloesser
Copy link
Collaborator

wow, will test tonight! Thanks!
And yeah, I got a tendency to get the most complicated synths :-)

@markusschloesser
Copy link
Collaborator

markusschloesser commented Jan 4, 2021

mixed results:

  1. auto configure seems to find it, but it's on the wrong ports (and those change when you look at the screenshots)
    image
    image

when I configure the correct ports (each synth does have its own port), connection is lost
2. trying to get the edit buffer results in the correct message "The Alesis Andromeda A6 has no way to request the edit buffer or program place"
3. trying to get programs does not work, might be because of either 1. or problem in the detection algorithm

@christofmuc
Copy link
Owner Author

christofmuc commented Jan 4, 2021

Great! That should simply be a timing issue - add a long timeout. That should fix the detection problem, i.e. add a function

    def deviceDetectWaitMilliseconds():
        return 600

would make it wait 600 ms for a reply before moving on to the next MIDI interface.

Edit Buffer won't work, because it has none. Importing Sysex banks from Internet works, I could do that ;-)
Clicking it will send it into program 127 of bank 0.

Importing Banks should work when it gets detected

christofmuc added a commit that referenced this issue Jan 4, 2021
…led adaptations yet, waiting for feedback.

(cherry picked from commit bf0a823)
christofmuc added a commit that referenced this issue Jan 4, 2021
…led adaptations yet, waiting for feedback.
@markusschloesser
Copy link
Collaborator

didn't work with 600ms. Also tried 1000ms
Also I have 2 different sysex docs for the a6 and am trying to understand what is required. When capturing thru midi ox with a working librarian (a6librarian.exe can send if you want):

  1. single program request: F0 00 00 0E 1D 01 00 00 F7 (user 1)
  2. bank request: F0 00 00 0E 1D 0A 00 F7
  3. getting user preset 1-3:
    0008C04E Loo And F0 Buffer: 9 Bytes System Exclusive
    SYSX: F0 00 00 0E 1D 01 00 01 F7
    0008C54B Loo And F0 Buffer: 9 Bytes System Exclusive
    SYSX: F0 00 00 0E 1D 01 00 02 F7
    0008CA42 Loo And F0 Buffer: 9 Bytes System Exclusive
    SYSX: F0 00 00 0E 1D 01 00 03 F7
  4. getting "Mix" 1: SYSX: F0 00 00 0E 1D 05 00 00 F7
    So is the detection problem in the sysex or somewhere else? 🤔

@christofmuc
Copy link
Owner Author

@markusschloesser If the detection worked (green bar), but on the wrong MIDI port, it must be timing. Sometimes MIDI loops can also cause problems. What I'd need here is the MIDI log of the auto detection run, ideally only with the A6 enabled and a green bar (but wrong MIDI output) result.

The sysex strings are ok, that's what we do. Though I don't get the difference between 1.) and 3) user preset 1.

@markusschloesser
Copy link
Collaborator

I disabled all other devices and ran auto config again. The Andromeda is "green" but the lower log says "No ... could be detected", the previously manually selected port stayed identical. However for the first time, when I do "import patches from synths" I get the "select bank" dialogue. But nothing is received, the A6 doesn't dump anything.
Midi log for setup:
07:29:48.503: Out Microsoft GS Wavetable Synth Sysex [f0 00 00 0e 1d 01 00 00 f7]
07:29:49.108: Out JP-8080 DIN 4 Sysex [f0 00 00 0e 1d 01 00 00 f7]
07:29:49.712: Out Alphabase HST3 Sysex [f0 00 00 0e 1d 01 00 00 f7]
07:29:50.317: Out MKS80 DIN 10 Sysex [f0 00 00 0e 1d 01 00 00 f7]
07:29:50.321: In MKS80 DIN 10 Sysex [f0 00 00 0e 1d 01 00 00 f7]
07:29:50.921: Out cyber 6 DIN 5 Sysex [f0 00 00 0e 1d 01 00 00 f7]
07:29:50.927: In cyber 6 DIN 5 Sysex [f0 00 00 0e 1d 01 00 00 f7]
07:29:51.527: Out Launchpad HST 4 Sysex [f0 00 00 0e 1d 01 00 00 f7]
07:29:52.135: Out Kijimi DIN 6 Sysex [f0 00 00 0e 1d 01 00 00 f7]
07:29:52.743: Out HST 5-10 Sysex [f0 00 00 0e 1d 01 00 00 f7]
07:29:53.349: Out Prophet12 DIN1 Sysex [f0 00 00 0e 1d 01 00 00 f7]
07:29:53.956: Out FS1R DIN 7 Sysex [f0 00 00 0e 1d 01 00 00 f7]
07:29:54.565: Out USB 2 Sysex [f0 00 00 0e 1d 01 00 00 f7]
07:29:55.173: Out Andromeda DIN 2 Sysex [f0 00 00 0e 1d 01 00 00 f7]
07:29:55.777: Out Seaboard HST 1 Sysex [f0 00 00 0e 1d 01 00 00 f7]
07:29:56.384: Out MS-1 DIN 8 Sysex [f0 00 00 0e 1d 01 00 00 f7]
07:29:56.422: In Andromeda DIN 2 Sysex [f0 00 00 0e 1d 00 00 00 26 15 50 42 56 0c 08 22 72 4a 05 6b 06 04 08 10 20 40 00 01 02 00 00 00 00 7e 00 56 02 42 02 7c 00 00 00 04 50 04 22 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 38 01 0e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 30 3d 43 7e 47 1a 20 0b 2e 70 01 00 70 05 12 00 00 00 00 00 08 00 00 00 00 01 38 01 0e 20 00 00 0c 00 00 00 00 20 31 04 00 18 00 01 04 00 00 00 00 7e 7d 0f 00 20 40 00 00 00 00 00 00 00 40 7f 5f 01 00 00 00 1e 03 00 07 00 00 00 00 00 00 00 00 00 00 00 00 60 5f 7f 01 00 04 08 00 00 00 00 00 00 00 00 00 00 00 00 7f 7e 07 00 10 20 00 00 00 00 00 00 00 60 7f 62 00 00 00 00 4f 01 40 03 00 00 00 00 00 00 00 00 2b 40 03 00 70 6f 3f 08 02 02 00 00 00 00 00 00 00 00 00 00 00 00 40 3f 7f 03 00 08 10 00 00 00 00 00 00 00 00 00 00 00 00 7e 7d 0f 00 20 40 00 00 00 00 00 00 00 00 00 00 00 00 78 77 3f 00 00 01 02 00 00 00 00 00 00 00 00 00 00 00 60 5f 7f 01 00 04 08 00 00 00 00 00 00 00 00 00 00 00 00 7f 7e 07 00 10 20 00 00 00 00 00 00 00 00 00 00 00 00 7c 7b 1f 00 40 00 01 00 00 00 00 00 00 00 4a 21 00 00 70 6f 3f 01 00 02 00 00 00 00 00 00 00 00 3c 00 0d 00 40 3f 7f 05 04 08 00 00 00 00 00 00 00 00 00 45 05 00 00 7e 7d 4f 00 20 00 00 00 00 00 00 00 00 40 7c 60 00 00 78 77 5f 40 00 01 00 00 00 00 00 00 00 00 7e 40 01 00 60 5f 7f 0d 00 04 00 00 00 00 00 00 00 00 30 0d 14 00 00 7f 7e 1f 08 10 20 00 00 00 00 00 00 00 00 00 00 00 00 7c 7b 1f 00 40 00 01 00 00 00 00 00 00 00 00 00 00 00 70 6f 7f 00 00 02 04 00 00 00 00 00 00 00 30 07 00 00 40 3f 7f 05 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 7e 7d 0f 00 20 40 00 00 00 00 00 00 00 00 00 00 00 00 78 77 3f 00 00 01 02 00 00 00 00 00 00 00 3c 40 00 00 60 5f 7f 0e 00 04 00 00 00 00 00 00 00 00 68 03 14 00 00 7f 7e 0b 00 10 20 00 00 00 00 00 00 00 60 09 18 00 00 7c 7b 5f 01 40 00 00 00 00 00 00 00 00 00 00 00 00 00 70 6f 7f 00 01 02 04 00 00 00 00 00 00 00 00 00 00 00 40 3f 7f 03 00 08 10 00 00 00 00 00 00 00 50 07 18 00 00 7e 7d 07 01 20 40 00 00 00 00 00 00 00 40 15 5b 01 00 78 77 1f 04 00 01 02 00 00 00 00 00 00 00 00 00 00 00 60 5f 7f 10 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 7f 7e 43 00 10 00 00 00 00 00 00 00 00 00 08 38 00 00 7c 7b 1f 00 40 00 00 00 00 00 00 00 00 00 16 10 2b 69 73 6f 7f 00 00 02 00 00 00 00 00 00 00 00 70 00 0f 00 40 3f 7f 03 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 7e 7d 0f 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 00 00 01 00 04 00 10 00 00 00 7e 73 07 00 00 00 00 00 04 00 00 00 00 00 00 01 00 00 00 10 00 00 00 00 02 00 00 00 00 40 7f 78 01 04 00 00 00 40 00 00 00 00 08 00 00 00 00 01 00 00 00 10 00 00 00 00 02 00 00 00 20 00 00 00 00 00 78 0f 1f 40 00 00 00 00 08 00 00 00 00 01 00 3c 00 00 00 00 00 00 03 44 14 21 74 48 59 34 08 13 2a 5d 4a 39 33 77 6f 21 38 18 03 26 15 29 77 68 65 34 39 17 6e 6e 5a 7f 7b 0f 30 40 48 12 44 0e 19 4b 06 71 22 55 2d 19 3f 76 1e 1e 04 08 33 64 54 22 75 4e 5d 4c 18 77 6a 6d 4d 7b 3f 7f 7f 7d 07 00 20 03 00 0f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 41 23 41 00 00 78 43 09 40 30 00 00 00 00 00 20 00 00 00 00 00 00 00 03 20 00 43 02 04 10 70 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0d 7a 15 04 20 03 3e 1a 00 00 54 31 0f 00 00 40 00 12 74 03 00 00 00 00 00 02 00 00 00 00 00 00 18 00 02 20 14 20 00 01 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 50 20 34 3a 00 00 7c 7f 0f 40 0b 00 00 00 00 00 10 00 00 00 00 00 00 30 00 10 00 24 03 02 08 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 10 03 40 0c 60 00 40 02 00 00 00 10 00 00 02 00 28 70 7f 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 01 00 00 00 00 00 54 3c 7e 0f 40 40 02 00 0a 0c 00 10 20 00 01 51 02 04 08 00 40 01 00 3c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 40 00 5c 07 6c 20 7b 03 09 18 01 30 6c 03 04 40 5c 7f 7f 7f 7f 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 04 4c 2d 50 61 40 04 00 40 6a 67 7f 01 04 00 00 00 01 00 00 02 04 10 10 2a 40 00 01 00 18 00 40 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 40 43 44 40 77 41 66 46 0c 40 38 64 60 06 14 00 40 64 7f 7f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 48 05 79 0d 70 00 00 28 79 0c 00 01 01 00 00 00 20 00 20 40 00 02 24 05 08 10 40 01 03 00 78 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 09 00 00 00 00 00 00 70 6f 3f 00 00 00 18 18 00 00 07 01 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 60 03 00 00 00 00 00 00 30 04 00 00 00 00 00 00 00 00 00 00 00 00 00 32 00 00 00 00 00 00 00 00 0c 00 00 00 00 00 00 0c 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3c 00 70 01 40 07 00 1e 00 78 00 60 03 00 0f 00 3c 00 70 01 40 07 00 1e 00 78 00 60 03 00 0f 00 3c 00 70 01 00 02 00 08 00 20 00 00 01 00 04 00 10 00 40 00 00 02 00 08 00 20 00 00 01 00 04 00 10 00 40 00 00 02 00 08 00 00 00 00 00 00 40 08 11 22 44 08 11 22 44 08 00 00 00 18 10 60 7f 17 00 04 08 00 20 00 24 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 48 01 00 00 00 00 20 00 00 18 00 30 44 00 00 01 00 00 00 30 00 40 17 00 04 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 21 00 00 00 00 00 00 01 00 68 1d 00 00 00 00 00 00 00 00 00 00 10 03 2e 09 42 01 00 00 00 00 00 00 00 00 00 40 0c 00 72 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 60 7f 7f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0b 10 00 00 00 00 00 00 00 40 0c 0d 07 00 76 5a 35 08 19 40 00 01 70 01 00 00 40 31 00 00 00 00 40 0c 40 7f 50 00 00 00 00 00 40 00 00 00 00 00 30 20 00 01 00 00 18 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 f7]
07:29:57.001: Out K5000s DIN 3 Sysex [f0 00 00 0e 1d 01 00 00 f7]
07:29:57.608: Out MPKmini HST 2 Sysex [f0 00 00 0e 1d 01 00 00 f7]
07:29:58.216: Out RD-8 DIN 9 Sysex [f0 00 00 0e 1d 01 00 00 f7]
07:29:58.821: Out LoopBe Internal MIDI Sysex [f0 00 00 0e 1d 01 00 00 f7]
07:29:58.821: In LoopBe Internal MIDI Sysex [f0 00 00 0e 1d 01 00 00 f7]
07:29:59.426: Out ADVANCE61 USB PORT 1 Sysex [f0 00 00 0e 1d 01 00 00 f7]
07:30:00.034: Out ADVANCE61 MIDI PORT 2 Sysex [f0 00 00 0e 1d 01 00 00 f7]
07:30:00.642: Out Electra Controller Sysex [f0 00 00 0e 1d 01 00 00 f7]
07:30:01.250: Out MIDIOUT2 (Electra Controller) Sysex [f0 00 00 0e 1d 01 00 00 f7]
07:30:01.856: Out MIDIOUT3 (Electra Controller) Sysex [f0 00 00 0e 1d 01 00 00 f7]
07:30:02.463: Out MCU Pro USB v3.1 Sysex [f0 00 00 0e 1d 01 00 00 f7]
07:30:03.080: Out MIDIOUT2 (MCU Pro USB v3.1) Sysex [f0 00 00 0e 1d 01 00 00 f7]

When I do the "get patches from synth" the midi log shows
07:33:25.834: Out Andromeda DIN 2 Sysex [f0 00 00 0e 1d 01 00 00 f7]
07:33:27.084: In Andromeda DIN 2 Sysex [f0 00 00 0e 1d 00 00 00 26 15 50 42 56 0c 08 22 72 4a 05 6b 06 04 08 10 20 40 00 01 02 00 00 00 00 7e 00 56 02 42 02 7c 00 00 00 04 50 04 22 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 38 01 0e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 30 3d 43 7e 47 1a 20 0b 2e 70 01 00 70 05 12 00 00 00 00 00 08 00 00 00 00 01 38 01 0e 20 00 00 0c 00 00 00 00 20 31 04 00 18 00 01 04 00 00 00 00 7e 7d 0f 00 20 40 00 00 00 00 00 00 00 40 7f 5f 01 00 00 00 1e 03 00 07 00 00 00 00 00 00 00 00 00 00 00 00 60 5f 7f 01 00 04 08 00 00 00 00 00 00 00 00 00 00 00 00 7f 7e 07 00 10 20 00 00 00 00 00 00 00 60 7f 62 00 00 00 00 4f 01 40 03 00 00 00 00 00 00 00 00 2b 40 03 00 70 6f 3f 08 02 02 00 00 00 00 00 00 00 00 00 00 00 00 40 3f 7f 03 00 08 10 00 00 00 00 00 00 00 00 00 00 00 00 7e 7d 0f 00 20 40 00 00 00 00 00 00 00 00 00 00 00 00 78 77 3f 00 00 01 02 00 00 00 00 00 00 00 00 00 00 00 60 5f 7f 01 00 04 08 00 00 00 00 00 00 00 00 00 00 00 00 7f 7e 07 00 10 20 00 00 00 00 00 00 00 00 00 00 00 00 7c 7b 1f 00 40 00 01 00 00 00 00 00 00 00 4a 21 00 00 70 6f 3f 01 00 02 00 00 00 00 00 00 00 00 3c 00 0d 00 40 3f 7f 05 04 08 00 00 00 00 00 00 00 00 00 45 05 00 00 7e 7d 4f 00 20 00 00 00 00 00 00 00 00 40 7c 60 00 00 78 77 5f 40 00 01 00 00 00 00 00 00 00 00 7e 40 01 00 60 5f 7f 0d 00 04 00 00 00 00 00 00 00 00 30 0d 14 00 00 7f 7e 1f 08 10 20 00 00 00 00 00 00 00 00 00 00 00 00 7c 7b 1f 00 40 00 01 00 00 00 00 00 00 00 00 00 00 00 70 6f 7f 00 00 02 04 00 00 00 00 00 00 00 30 07 00 00 40 3f 7f 05 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 7e 7d 0f 00 20 40 00 00 00 00 00 00 00 00 00 00 00 00 78 77 3f 00 00 01 02 00 00 00 00 00 00 00 3c 40 00 00 60 5f 7f 0e 00 04 00 00 00 00 00 00 00 00 68 03 14 00 00 7f 7e 0b 00 10 20 00 00 00 00 00 00 00 60 09 18 00 00 7c 7b 5f 01 40 00 00 00 00 00 00 00 00 00 00 00 00 00 70 6f 7f 00 01 02 04 00 00 00 00 00 00 00 00 00 00 00 40 3f 7f 03 00 08 10 00 00 00 00 00 00 00 50 07 18 00 00 7e 7d 07 01 20 40 00 00 00 00 00 00 00 40 15 5b 01 00 78 77 1f 04 00 01 02 00 00 00 00 00 00 00 00 00 00 00 60 5f 7f 10 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 7f 7e 43 00 10 00 00 00 00 00 00 00 00 00 08 38 00 00 7c 7b 1f 00 40 00 00 00 00 00 00 00 00 00 16 10 2b 69 73 6f 7f 00 00 02 00 00 00 00 00 00 00 00 70 00 0f 00 40 3f 7f 03 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 7e 7d 0f 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 00 00 01 00 04 00 10 00 00 00 7e 73 07 00 00 00 00 00 04 00 00 00 00 00 00 01 00 00 00 10 00 00 00 00 02 00 00 00 00 40 7f 78 01 04 00 00 00 40 00 00 00 00 08 00 00 00 00 01 00 00 00 10 00 00 00 00 02 00 00 00 20 00 00 00 00 00 78 0f 1f 40 00 00 00 00 08 00 00 00 00 01 00 3c 00 00 00 00 00 00 03 44 14 21 74 48 59 34 08 13 2a 5d 4a 39 33 77 6f 21 38 18 03 26 15 29 77 68 65 34 39 17 6e 6e 5a 7f 7b 0f 30 40 48 12 44 0e 19 4b 06 71 22 55 2d 19 3f 76 1e 1e 04 08 33 64 54 22 75 4e 5d 4c 18 77 6a 6d 4d 7b 3f 7f 7f 7d 07 00 20 03 00 0f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 41 23 41 00 00 78 43 09 40 30 00 00 00 00 00 20 00 00 00 00 00 00 00 03 20 00 43 02 04 10 70 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0d 7a 15 04 20 03 3e 1a 00 00 54 31 0f 00 00 40 00 12 74 03 00 00 00 00 00 02 00 00 00 00 00 00 18 00 02 20 14 20 00 01 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 50 20 34 3a 00 00 7c 7f 0f 40 0b 00 00 00 00 00 10 00 00 00 00 00 00 30 00 10 00 24 03 02 08 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 10 03 40 0c 60 00 40 02 00 00 00 10 00 00 02 00 28 70 7f 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 01 00 00 00 00 00 54 3c 7e 0f 40 40 02 00 0a 0c 00 10 20 00 01 51 02 04 08 00 40 01 00 3c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 40 00 5c 07 6c 20 7b 03 09 18 01 30 6c 03 04 40 5c 7f 7f 7f 7f 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 04 4c 2d 50 61 40 04 00 40 6a 67 7f 01 04 00 00 00 01 00 00 02 04 10 10 2a 40 00 01 00 18 00 40 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 40 43 44 40 77 41 66 46 0c 40 38 64 60 06 14 00 40 64 7f 7f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 48 05 79 0d 70 00 00 28 79 0c 00 01 01 00 00 00 20 00 20 40 00 02 24 05 08 10 40 01 03 00 78 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 09 00 00 00 00 00 00 70 6f 3f 00 00 00 18 18 00 00 07 01 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 60 03 00 00 00 00 00 00 30 04 00 00 00 00 00 00 00 00 00 00 00 00 00 32 00 00 00 00 00 00 00 00 0c 00 00 00 00 00 00 0c 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3c 00 70 01 40 07 00 1e 00 78 00 60 03 00 0f 00 3c 00 70 01 40 07 00 1e 00 78 00 60 03 00 0f 00 3c 00 70 01 00 02 00 08 00 20 00 00 01 00 04 00 10 00 40 00 00 02 00 08 00 20 00 00 01 00 04 00 10 00 40 00 00 02 00 08 00 00 00 00 00 00 40 08 11 22 44 08 11 22 44 08 00 00 00 18 10 60 7f 17 00 04 08 00 20 00 24 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 48 01 00 00 00 00 20 00 00 18 00 30 44 00 00 01 00 00 00 30 00 40 17 00 04 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 21 00 00 00 00 00 00 01 00 68 1d 00 00 00 00 00 00 00 00 00 00 10 03 2e 09 42 01 00 00 00 00 00 00 00 00 00 40 0c 00 72 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 60 7f 7f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0b 10 00 00 00 00 00 00 00 40 0c 0d 07 00 76 5a 35 08 19 40 00 01 70 01 00 00 40 31 00 00 00 00 40 0c 40 7f 50 00 00 00 00 00 40 00 00 00 00 00 30 20 00 01 00 00 18 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 f7]
07:33:27.084: Out Andromeda DIN 2 Sysex [f0 00 00 0e 1d 01 00 01 f7]

When you do a bank request and knobkraft sends out [f0 00 00 0e 1d 01 00 00 f7] shouldn't that be F0 00 00 0E 1D 0A 00 F7? But where in your adaptation do you do bank requests? I can only see program requests

@markusschloesser
Copy link
Collaborator

The sysex strings are ok, that's what we do. Though I don't get the difference between 1.) and 3) user preset 1.
it was just to show you what other librarians do. 1. one a single request, 3. was 3 requests

@christofmuc
Copy link
Owner Author

@markusschloesser Well, it works, it's just slower than expected! Look at the log:

07:29:55.173: Out Andromeda DIN 2 Sysex [f0 00 00 0e 1d 01 00 00 f7]
...
07:29:56.422: In Andromeda DIN 2 Sysex [f0 00 00 0e 1d 00 00 00 26 15 50  ....

You can see from the timestamps that the Andromeda needs 1250 ms to answer the request, so even 1000 was not long enough. That's probably becaue the A6 needs to prepare the 2 Kilobyte+ download of a patch first.

Put in 1500 and try again.

The bank request is not yet implemented, but the Orm will just iterate over all 128 patches in a bank with single requests (you see the first message), so this is more a comfort/speed function we can do once the basic functions work.

It might be that we are sending the request for the second patch ([f0 00 00 0e 1d 01 00 01 f7]) too quickly for the A6 to respond, as it is a rather slow synth, this is when the bank dump will come in, or I need to add more pauses between the requests, which is missing I think.

@markusschloesser
Copy link
Collaborator

  1. so auto configure does not work (no .. could be detected), but manually assigning ports and checking for connectivity does work.
  2. patch request for "User Bank" or Preset Bank 1 or 2 does not work, A6 doesn't do anything (normally there's a "transmitting" status).
  3. tried with 1500 and even 2000ms
  4. the a6librarian has a default buffer size of 1024 and a pause between buffers of 20ms (attached)
    a6librarian.zip

@christofmuc
Copy link
Owner Author

Strange. I have to make you a version that ignores failed autodetection so that the manual override will allow you to try anyway - normally, if no green bar then it will not even try to request the bank. That's old behavior that needs to be removed when manually configuration is the only way.

Do you have the MIDI log of the failed autodetection?

Depending on how you setup the MIDI patch bays, I found that sometimes my MKS80 makes problems during auto-detection of other synhs since it echoes Sysex messages. Maybe turn it off for one try. Again, depends on your MIDI routing.

@markusschloesser
Copy link
Collaborator

markusschloesser commented Jan 5, 2021

no no, the light is actually green, but the log says "nothing found"
re midi routing: I have a mio10 and each synth has its own port. btw the a6librarian has an auto scan feature and it sends F0 7E 7F 06 01 F7
edit: I tried pasting that sysex into the adaptation but it complains about 2 many positional arguements, which, because I have no clue, I am unable to fix, event though I understand that the function (?) that is referred to, only allows 2

@christofmuc
Copy link
Owner Author

Ok, getting slightly confused, but good news about the f0 7e 7f message. I finally checked and found the sysex spec in the net, so it's always best to go to the source itself. There, the Universal Device Inquiry (that's what it is) is even specified, that should make detection a breeze.

Here is a version largely untested I hacked together after two beers that does use the f0 7e 7f for detection, and also has proper bank dump requests:

AlesisAndromedaA6.zip

Please provide the MIDI logs where possible, it makes it easier for me to understand what it is we send and what the reply is (if any)

@markusschloesser
Copy link
Collaborator

markusschloesser commented Jan 5, 2021

:-)
we're getting somewhere!

  • Detection works

  • bank request itself works

  • Andromeda sends complete user bank (128 patches) but knobkraft only sees and saves 1 patch
    midi log attached
    knobkraftA6 midi log.log

  • cheers!

christofmuc added a commit that referenced this issue Jan 6, 2021
… the Alesis Andromeda A6. This should work soon... #62
christofmuc added a commit that referenced this issue Jan 6, 2021
…eSysex() implementation with all shifts. Also, fixed the isBankDumpFinished() method to only stop at 128 patches. (#62)
christofmuc added a commit that referenced this issue Jan 6, 2021
… the Alesis Andromeda A6. This should work soon... #62

(cherry picked from commit 59a3f37)
christofmuc added a commit that referenced this issue Jan 6, 2021
…eSysex() implementation with all shifts. Also, fixed the isBankDumpFinished() method to only stop at 128 patches. (#62)

(cherry picked from commit 77ce6c3)
@christofmuc christofmuc added the Ready for release Will be part of the next release label Jan 6, 2021
christofmuc added a commit that referenced this issue Jan 6, 2021
@christofmuc
Copy link
Owner Author

New version released with 1.10.6 - I am optimistic.

@markusschloesser
Copy link
Collaborator

markusschloesser commented Jan 7, 2021

I successfully retrieved 127 new patches from the User Bank!!! :-) Currently receiving the preset banks.
Sending also works!
Questions:

  1. Is there a way I can retrieve single patches (your adaptation file has this, but I cannot find this in the UI)? Right now it's always banks, which takes ages.
  2. The A6 also has "Programs" and "Mixes" which consist of one or multiple "Programs". I assume the way to handle these are the same as we talked about in the FS1R discussion?
  3. Some patch names are different in knobkraft after import, the attached one has a dollar sign in knobkraft but not in the a6. Even not when sending it back!?
    knobcraftexport Andomeda Arpi techno patch.zip
  4. is there any way to see the original prog number in knobkraft? Why, because see 5.
  5. The idea with the edit buffer using the last user prog plus program change is good! BUT: the a6 has 4 options where to place receiving programs:
    From the manual:
    The SYSEX page of Store mode contains a useful feature under Soft Knob 3 labeled
    RCV TO (Receive To). This gives more flexibility in receiving SysEx Programs and
    Mixes:
    ->USER means that the incoming SysEx Program or Mix will go into the User
    Bank (at whatever Program or Mix number it was originally stored from).
    This is the default setting.
    ->HERE means that the incoming SysEx Program or Mix will overwrite the
    Program or Mix currently shown in the display, regardless of its original
    bank or number.
    ORIGIN means that the incoming SysEx Program or Mix will be written to
    wherever it originally came from. If it came from a Card bank and a card is
    present, it will write to the Card. Writing directly to a Preset bank from a Sys
    Ex file is not allowed.
    CARD allows you to select a card bank where the Program or Mix should go
    (assuming you have a properly initialized card plugged into the A6).

    Which means that your (very good) idea does not work with the A6. Right now I don't have a better suggestion though, with the exception that maybe a hint for users to check that setting is necessary (could be helpful for other synths as well! Midiquest does something similar)

@christofmuc
Copy link
Owner Author

I successfully retrieved 127 new patches from the User Bank!!! :-) Currently receiving the preset banks.
Sending also works!

Awesome!

Questions:

1. Is there a way I can retrieve single patches (your adaptation file has this, but I cannot find this in the UI)? Right now it's always banks, which takes ages.

Yes, the software can do it, but currently the idea is to request a single patch always as the edit buffer, because there is no UI to select which patch you want to receive. With no edit buffer implemented, we need a different way. In Bank Management mode (v 2.0) that would be easy, because you would see the bank structure of the synth, and can just click "refresh" for a single patch. Without it, we could only make an import dialog that not only offers banks but also individual patches. A bit awkward, but might work for the moment.

2. The A6 also has "Programs" and "Mixes" which consist of one or multiple "Programs". I assume the way to handle these are the same as we talked about in the FS1R discussion?

Yes, this is straightforward now that the communication works. Fast solution - copy A6.py and change it into one synth called "A6 Mixes" and adjust the parameters. Better solution - I expose the LoadDataFileCapability and we start introducing multiple data types per synth.

3. Some patch names are different in knobkraft after import, the attached one has a dollar sign in knobkraft but not in the a6. Even not when sending it back!?
   [knobcraftexport Andomeda Arpi techno patch.zip](https://github.com/christofmuc/KnobKraft-orm/files/5778821/knobcraftexport.Andomeda.Arpi.techno.patch.zip)

Will take a look. Could be a bug in the name extraction, or the A6 uses a different character set (common in synths). I didn't see the character set specified, it normally is not (except for Roland!). Then it is trial and error. and some characters are not even possible with JUCE (the Virus has some arrow characters that refuse to come up on the PC).

4. is there any way to see the original prog number in knobkraft? Why, because see 5.

Yes, the function numberFromDump() needs to be implemented ;-)
And the UI is not really pretty, I'll take it on the list.

5. The idea with the edit buffer using the last user prog plus program change is good! BUT: the a6 has 4 options where to place receiving programs:

Amazingly complex device, but the settings make sense. I think a text string that gives users some guidance on how to setup the synth totally makes sense, and could be trivially implemented and displayed in the Adaptation tab. Not sure if users will find it there, but the UI already is a bit overloaded? Theses setup guides I had seen in LaserMammoth, and I think they do make sense especially for some of the older devices.

@christofmuc
Copy link
Owner Author

I looked at the patch, and the 16th character of the name (at position 17 in the patch data) is an ordinal 36, which is an ASCII '$'. So I wouldn't know why the A6 doesn't display it. I don't hope we have an encoding / decoding problem hidden somewhere, does the patch sound as expected when you audition?

@markusschloesser
Copy link
Collaborator

I now imported around 350 patches from the internet, and for the first time since I got the andromeda, actually sent them to the a6 and played them for hours and categorized them. The duplication detection seemed to work fine and I enjoyed playing new sounds so much. So thank you! Your tool is fantastic :-)
Some internet patches were kicked out but I assume that's normal as probably there were some formatting issues.
BTW do you have a donation button somewhere?

@markusschloesser
Copy link
Collaborator

markusschloesser commented Jan 7, 2021

Questions:

1. Is there a way I can retrieve single patches (your adaptation file has this, but I cannot find this in the UI)? Right now it's always banks, which takes ages.

Yes, the software can do it, but currently the idea is to request a single patch always as the edit buffer, because there is no UI to select which patch you want to receive. With no edit buffer implemented, we need a different way. In Bank Management mode (v 2.0) that would be easy, because you would see the bank structure of the synth, and can just click "refresh" for a single patch. Without it, we could only make an import dialog that not only offers banks but also individual patches. A bit awkward, but might work for the moment.

MS: a button "request singular patch" could be added and after that, first do the bank thing, than a specific program. Problem might be that you ideally should do a full bank request first?

2. The A6 also has "Programs" and "Mixes" which consist of one or multiple "Programs". I assume the way to handle these are the same as we talked about in the FS1R discussion?

Yes, this is straightforward now that the communication works. Fast solution - copy A6.py and change it into one synth called "A6 Mixes" and adjust the parameters. Better solution - I expose the LoadDataFileCapability and we start introducing multiple data types per synth.

MS: I think I'll wait for the latter

3. Some patch names are different in knobkraft after import, the attached one has a dollar sign in knobkraft but not in the a6. Even not when sending it back!?
   [knobcraftexport Andomeda Arpi techno patch.zip](https://github.com/christofmuc/KnobKraft-orm/files/5778821/knobcraftexport.Andomeda.Arpi.techno.patch.zip)

Will take a look. Could be a bug in the name extraction, or the A6 uses a different character set (common in synths). I didn't see the character set specified, it normally is not (except for Roland!). Then it is trial and error. and some characters are not even possible with JUCE (the Virus has some arrow characters that refuse to come up on the PC).

4. is there any way to see the original prog number in knobkraft? Why, because see 5.

Yes, the function numberFromDump() needs to be implemented ;-)
And the UI is not really pretty, I'll take it on the list.

MS: that would be cool, also the new side panel you proposed, could/should show meta data. Meta data from import: date, which bank (or from which file/folder when sysex from computer), org prog number and name. But also user meta data: tags, comments, "used in song", etc?

5. The idea with the edit buffer using the last user prog plus program change is good! BUT: the a6 has 4 options where to place receiving programs:

Amazingly complex device, but the settings make sense. I think a text string that gives users some guidance on how to setup the synth totally makes sense, and could be trivially implemented and displayed in the Adaptation tab. Not sure if users will find it there, but the UI already is a bit overloaded? Theses setup guides I had seen in LaserMammoth, and I think they do make sense especially for some of the older devices.

MS: I have mine set to "here" and just select 127 before clicking something in knobkraft. And yes, the a6 is one of the most complex out there.
btw How do I rename a patch without sending it to the synth?

As I still (and similar to every forum) have no clue how to multi-quote, as put it inline

@christofmuc
Copy link
Owner Author

I now imported around 350 patches from the internet, and for the first time since I got the andromeda, actually sent them to the a6 and played them for hours and categorized them. The duplication detection seemed to work fine and I enjoyed playing new sounds so much. So thank you! Your tool is fantastic :-)

Freut mich! I know how you feel, these moments are why I wrote it in the first place!

Some internet patches were kicked out but I assume that's normal as probably there were some formatting issues.

Possible.

BTW do you have a donation button somewhere?

I'll think of something and let you know!

@christofmuc
Copy link
Owner Author

Renaming a patch can be done by just clicking on the patch name button in the current patch display (at the top).

@markusschloesser
Copy link
Collaborator

I am sorry, that's way over my head. I don't know exactly what you do in the tests (and only very roughly everywhere else).
I did do the run (&debug) result was always code 0.
Do I need to convert the edit buffer to a programdump?
Line 82&83 are currently out commented
# if isEditBufferDump(message): # return [0xF0, 0x00, 0x00, 0x0E, 0x1D, 0x00, bank, program] + message[7:]

@christofmuc
Copy link
Owner Author

Okay, I was hinting that the convertEditBuffer() would create somethign like

[0xF0, 0x00, 0x00, 0x0E, 0x1D, 0x00, bank, program] + message[7:]

while isEditBuffer says:

def isEditBufferDump(message):
    return len(message) > 6 and message[:7] == [0xf0, 0x00, 0x00, 0x0e, 0x1d, 0x02, 0x10]  # from chris on gh forum

So from the 0x1d, 0x02 I can see that isEditBufferDump() will be false for the output of convertToEditBuffer()... that could cause problems.

What are you trying to accomplish? So we have now a way to request the edit buffer, which is good, and recognize it as an edit buffer, which is great.

Is it possible to send the edit buffer as well? Because the current implementation turns it into a singleProgramBuffer, and then we could just say

def convertToEditBuffer(channel, message):
    return convertToProgramDump(channel, message, 127)

So what is the new information you got over what we had before?

@christofmuc
Copy link
Owner Author

So I understand that the information is that we can request the edit buffer, but cannot send it, but need to send a program dump?

@markusschloesser
Copy link
Collaborator

markusschloesser commented Jan 11, 2021

no, I am only trying to request the edit buffer (or as written further above, receive it manually).
Reason: I often try out patches from the internet or ROM presets and usually tweak things a bit (>edit buffer) and would like to transfer those to knobkraft and have them saved as "program/patch" (maybe with an option to rename before saving). With this I don't have to save (and tediously rename) ON the device, potentially overwriting existing stuff (in case of ROM presets I would have to store on some user place).

So

  1. request/import edit buffer
  2. save as patch/program
  3. everything else can stay as already implemented, as long as I don't find a working "send edit buffer" sysex

Maybe some communication / language thing :-)

@christofmuc
Copy link
Owner Author

Ah, more that I am not 100% paying attention as I am in the middle of a big repair required for the multi-data-type downloads. That was a bit more work than expected.

So... Understood.

We cannot change the edit buffer before it reaches the database. But we can change it out the way out, so the edit buffer dump we got from the A6 never is sent back (that's probably the bug that was mentioned in the thread in 2013 or so).

So...

Your request edit buffer is correct
Your isEditBufferDump is correct

But... nameFromDump() now needs to work for edit buffers as well, and convertToProgramDump() as well, because EditBuffers will be stored in the database and when you click on them they should be transformed into program Dumps.

Actually, convertToEditBuffer() is more important because once it is there, it takes precedence over convertToProgramDump(), because we assume this is what you want. Let me quickly code this and paste it here.

@christofmuc
Copy link
Owner Author

    def nameFromDump(message):
        if isSingleProgramDump(message):
            data_block = unescapeSysex(message[8:-1])  # The data block starts at index 8, and does not include the 0xf7
            return ''.join([chr(x) for x in data_block[2:2 + 16]])
        if isEditBufferDump(message):
            data_block = unescapeSysex(message[7:-1])
            return ''.join([chr(x) for x in data_block[2:2 + 16]])
        raise Exception("Can only extract name from master keyboard program dump")

@markusschloesser
Copy link
Collaborator

Thanks!

  1. I had to delete all db (luckily test) files, cos otherwise kk wouldn't do anything.
  2. But now I successfully got an edit buffer. And can repeat that.
  3. However it does not have a name, so I don't know where it is, and I think because the name is empty I cannot rename it.
  4. Also after changing the patch on the A6 and doing another edit buffer request, kk hangs again. And won't do anything unless I delete the DB file.
  5. cannot export sysex (hangs), but attached log export and db file (containing only one freshly imported edit buffer)
    a6namedump.zip

test.zip

@christofmuc
Copy link
Owner Author

Phew. Did you add my version of the nameFromDump()?

That should have worked for the edit buffer?

Else, here is a version I just made, maybe try this with a fresh database:
AlesisAndromedaA6.zip

@christofmuc
Copy link
Owner Author

Okay, with my adaptation you database works - it was the nameFromDump() function, that also needs to work now for the edit buffer dumps (as we request them and store them immediately in the database)

@markusschloesser
Copy link
Collaborator

it works!! this is fantastic! Thank you.
you added quite a bit of code 🤯
don't know if it's the special thing about this implementation or general, but renaming a patch has some weirdness:

  1. renaming a patch, produces a new patch with that name, while the same patch obviously already exists
  2. when a patches name is already long, I can still append something, press ok, but nothing happens, the patch is not renamed
  3. when a patch is renamed, the newly produced patch is shown in the upper field, but the old and original patch is still selected in the lower pane

btw you ok with me doing some advertising for kk on forums?

@christofmuc
Copy link
Owner Author

@markusschloesser Not enough code yet ;-), the code duplication you are seeing comes from an unchanged createFingerprint() function, that does not yet match edit buffer dumps and program dumps.

What I learned from this: Currently, the idea is to store everything we get from the synth as is in the database, and convert it fit for the purpose when sending out. Now, with the edit buffer that can be received but never must be send, we would need less code if we could convert a received edit buffer before storing it in the database, because then we'd only have one data type in the database. On the other hand, if there is a bug in the conversion you end up with crap in the database, which never is a good idea.

The current design allows us to store what ever message we accept as valid answer (isEditBuffer()) into the database, and take care when sending to the synth that the right message is created.

This is why we needed to adjust both the convertToEditBuffer() as well as the convertToProgramDump() functions. Though convertToProgramDump() is not used when convertToEditBuffer() is present, until we get the bank management feature, then we'll need it.

In addition, all other functions must be aware that we could now get either an edit buffer dump or a program dump as a parameter, increasing the code required.

Plus, in the convertToEditBuffer() function, we need to append a MIDI program change message if we want the synth to automatically switch to our "edit buffer program place". This is done automatically in case there is not edit buffer capabiltiy implemented, but now we have.

Another solution would be to split the EditBufferCapability into a "ReceiveEditBufferCapability" and a "SendEditBufferCapability", but as this is a special case hopefully not happening with too many synths, I am not sure it's worth the effort.

You will see more code coming in when we do the multi-data types :-)

And please, feel free to advertise, that would help me a lot!

@markusschloesser
Copy link
Collaborator

Been enjoying the new functionality a lot in the last couple of days, so thank you again! 🌻
I can only assess this from a logical and not from a code perspective, so please bear with me:

@markusschloesser Not enough code yet ;-), the code duplication you are seeing comes from an unchanged createFingerprint() function, that does not yet match edit buffer dumps and program dumps.

MS: does that also mean, that I cannot run the manual deduplication? I haven't dared to try it yet.

What I learned from this: Currently, the idea is to store everything we get from the synth as is in the database, and convert it fit for the purpose when sending out. Now, with the edit buffer that can be received but never must be send, we would need less code if we could convert a received edit buffer before storing it in the database, because then we'd only have one data type in the database. On the other hand, if there is a bug in the conversion you end up with crap in the database, which never is a good idea.

The current design allows us to store what ever message we accept as valid answer (isEditBuffer()) into the database, and take care when sending to the synth that the right message is created.

This is why we needed to adjust both the convertToEditBuffer() as well as the convertToProgramDump() functions. Though convertToProgramDump() is not used when convertToEditBuffer() is present, until we get the bank management feature, then we'll need it.

MS: what I don't understand is, that "stuff that's coming from the A6" is identical, no matter if program or edit buffer. Can't you just treat it identically? With the exception of "how to request it" of course. Or is that what you're proposing?

In addition, all other functions must be aware that we could now get either an edit buffer dump or a program dump as a parameter, increasing the code required.

Plus, in the convertToEditBuffer() function, we need to append a MIDI program change message if we want the synth to automatically switch to our "edit buffer program place". This is done automatically in case there is not edit buffer capabiltiy implemented, but now we have.

Another solution would be to split the EditBufferCapability into a "ReceiveEditBufferCapability" and a "SendEditBufferCapability", but as this is a special case hopefully not happening with too many synths, I am not sure it's worth the effort.

MS: but might make maintenance easier! And the sysex for that is different anyway

You will see more code coming in when we do the multi-data types :-)

And please, feel free to advertise, that would help me a lot!

MS: will do!

@christofmuc
Copy link
Owner Author

@markusschloesser You can run the Deduplicate/Reindex when the log tells you that there are patches that need reindexing. Did I already give you the fixed adaptation with the fingerprinting implemented? Maybe I forgot.

@markusschloesser
Copy link
Collaborator

you haven't :-)

@christofmuc
Copy link
Owner Author

But I did the Kijimi ;-)

Here is the new version, which should complain about needing reindexing:
AlesisAndromedaA6.zip

@markusschloesser
Copy link
Collaborator

Kijimi indeed! :-)
Thanks! I ran manual dedup and it found one. Didn't tell me before.
Patch comparison doesn't do anything currently, correct? Only tried A6 and P12, but have a couple of entries with identical names on which I wanted to try it out

@christofmuc
Copy link
Owner Author

Patch comparison should open a window with a side-by-side diff of the the last two selected patches. Like send on to synth, send the second one to synth, press Patch comparison -> popup window with diff. If the synths have parameter info (only very few for now), you can even see the difference.

Here is an example from the Oberheim Matrix 1000, which can unpack the paramters into clear text:

grafik

@christofmuc
Copy link
Owner Author

Closing this as the 1.11.0 now contains the latest and greatest version of the A6, which apart from being a bit more complex than necessary seems to work and have all features the synth offers.

@markusschloesser
Copy link
Collaborator

found 2 issues (latest version):

  1. receive manual dump seems to do different things to "request edit buffer". Sending out from A6 a changed (!) preset and receiving it manually says "nothing new found"
  2. after doing 1. and then "Import Edit buffer" crashes KK (after reopening KK and requesting the same edit buffer, it successfully is transferred and detected as differently)
    Will have to replicate and will than upload logs

@christofmuc
Copy link
Owner Author

found 2 issues (latest version):

1. receive manual dump seems to do different things to "request edit buffer". Sending out from A6 a changed (!) preset and receiving it manually says "nothing new found"

Wouldn't that be expected? Did you change the preset and stored it in memory? E.g. my Rev2 will always send the program dump, not edit buffer, when I force it manually dump.

2. after doing 1. and then "Import Edit buffer" crashes KK (after reopening KK and requesting the same edit buffer, it successfully is transferred and detected as differently)

Ouch.

@markusschloesser
Copy link
Collaborator

  1. further investigation via Midi-OX: I edited one PRESET (but couldn't save it, because ROM preset). Sending that (supposedly) changed preset via "sysex send" from the A6 does NOT send the changed one (in the edit buffer), but the ORIGINAL. Requesting via sysex with the edit buffer command, does indeed receive the CHANGED preset. strange logic, but will put this into the Wiki for the A6.
    The other strange thing is, that the first received sysex is 2350 bytes, while receiving the edit buffer is 2349 bytes ???
    Documents.zip. Both dumps attached.
  2. how to crash:
    I press "receive m
    82fd09ed-8073-4469-b9dd-3d83a49d19dd.zip
    anual dump"
    II stop (or actually receive, doesn't matter)
    III press "Import edit buffer from synth"
    crash (dmp attached)

@christofmuc
Copy link
Owner Author

1. further investigation via Midi-OX: I edited one PRESET (but couldn't save it, because ROM preset). Sending that (supposedly) changed preset via "sysex send" from the A6 does NOT send the changed one (in the edit buffer), but the ORIGINAL. Requesting via sysex with the edit buffer command, does indeed receive the CHANGED preset. strange logic, but will put this into the Wiki for the A6.

Yeah, many synths do that. But in this case it seems to be either a bug or an oversight in the A6, as it does provide an edit buffer request, but somehow does return the program place. And it does not accept an edit buffer when sent (that's the original bug).

   The other strange thing is, that the first received sysex is 2350 bytes, while receiving the edit buffer is 2349 bytes ???

That's ok (and the reason for all the code added to the adaptation) - an edit buffer dump has code 0x02, 0x10 (marking the edit buffer), a program dump has code 0x00, [bank], [program], thus the program dump message needs one byte more. All the rest is identical. So in the database there'll be messages both with 2350 and 2349 bytes, and we convert on send/export.

   [Documents.zip](https://github.com/christofmuc/KnobKraft-orm/files/5832785/Documents.zip). Both dumps attached.

2. how to crash:
   I press "receive m
   [82fd09ed-8073-4469-b9dd-3d83a49d19dd.zip](https://github.com/christofmuc/KnobKraft-orm/files/5832808/82fd09ed-8073-4469-b9dd-3d83a49d19dd.zip)
   anual dump"
   II stop (or actually receive, doesn't matter)
   III press "Import edit buffer from synth"
   crash (dmp attached)

Thanks! This time even the automatic crash upload into Sentry worked. That should be an easy fix.

@markusschloesser
Copy link
Collaborator

1. further investigation via Midi-OX: I edited one PRESET (but couldn't save it, because ROM preset). Sending that (supposedly) changed preset via "sysex send" from the A6 does NOT send the changed one (in the edit buffer), but the ORIGINAL. Requesting via sysex with the edit buffer command, does indeed receive the CHANGED preset. strange logic, but will put this into the Wiki for the A6.

Yeah, many synths do that. But in this case it seems to be either a bug or an oversight in the A6, as it does provide an edit buffer request, but somehow does return the program place. And it does not accept an edit buffer when sent (that's the original bug).

To clarify: requesting via sysex works fine and retrieves the actual edit buffer.
Sending from the A6 panel (there is a dedicated "send sysex" on the A6) as sysex, sends original program and NOT the edit buffer. So the way it is implemented in kk is ok!

@christofmuc
Copy link
Owner Author

Crash fixed with 1.11.1

@markusschloesser
Copy link
Collaborator

When I'm done with the K5000 adaptation, I'm gonna try bank management for the andromeda

@christofmuc christofmuc removed the Ready for release Will be part of the next release label Feb 23, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants