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 Yamaha FS1r #73

Open
christofmuc opened this issue Jan 9, 2021 · 53 comments
Open

Support Yamaha FS1r #73

christofmuc opened this issue Jan 9, 2021 · 53 comments

Comments

@christofmuc
Copy link
Owner

The documentation is available, e.g. here: https://soundprogramming.net/manuals/Yamaha_FS1R_DataList.pdf

The FS1r also mimicks as a DX7, so maybe that should be done first.

It is currently not possible as an adaptation, but we need the code that I made for the refaceDX, which is a Yamaha and uses the exact same concept of addresses and stream dumps. So this is on hold until we get the right capability implemented.

@markusschloesser
Copy link
Collaborator

https://github.com/eclab/edisyn might be helpful, a full editor for (amongst others) the fs1r, Apache 2.0 license

@mslinn
Copy link
Contributor

mslinn commented Oct 2, 2023

@markusschloesser The Edisyn docs go into detail about how it does not support Windows very well due to issues with Java MIDI on Windows. :(

@markusschloesser
Copy link
Collaborator

@mslinn I am aware, but mostly had it working a while ago, but yeah, that and the stupid Oracle licensing mess, is meh.
What also kept me from using edisyn in the past, that it did not have a librarian, hence this GH issues, but iirc that has changed, not sure however if for all synths

@christofmuc
Copy link
Owner Author

Actually, the implementation of the adaptations should by now allow to implement the FS1r, even if it is a complex synth. I made a refaceDX adaptation to test the Yamaha protocol, and I think they are all very similar to each other.

@christofmuc
Copy link
Owner Author

The document can be found at the Yamaha site at https://usa.yamaha.com/files/download/other_assets/4/317954/FS1RE2.PDF

@markusschloesser
Copy link
Collaborator

i tried out the new plugin functionality of chatgpt and asked some (hopefully) good questions, this is the result:
https://chat.openai.com/share/f2de7acd-8eff-4781-a04b-8f2b113dd62b
Is this something worth proceeding with, or rather not?

@christofmuc
Copy link
Owner Author

Hm, not too bad, but also still very generic and not really based on the FS1R. The main challenge with the Yamaha (and Rolands) is to actually understand the data format, as they are so convoluted.

We usually want to ignore multi modes and rather just have the synth in single mode, and then determine what parts of the messages make up a single patch. Mostly 4 voices here on the FS1R, but not knowing the synth I have no idea what I am looking at in the documentation, It has 4 different native bulk dumps - but which 4?

@markusschloesser
Copy link
Collaborator

markusschloesser commented Oct 9, 2023

you mean this?
3.2 Bulk Data
FS1R transmits and receives 4 kinds of bulk data (1- 4, FS1R native) in addition to reception of Yamaha DX series' bulk data (5-6, VCED and ACED), with "Receive Bulk Dump = on" and Device Number contained in System Exclusive massages matches the FS1R Device Number setting. On reception of a request, FS1R transmits out the requested parameter change.

  1. Performance bulk dump
  2. Voice bulk dump
  3. Fseq bulk dump
  4. System bulk dump
  5. DX Series VCED bulk dump
  6. DX Series ACED bulk dump

Page 13 of the normal manual specifies this:
image
So 1. consists of 4 x 2. plus 3.

For now I would neglect 5. and 6.

I'll try to feed this into ChatGPT and report back (btw I also tried out Bard and right now it's imho completely BS)

@christofmuc
Copy link
Owner Author

That's very similar to the Roland format with 1 performance and 4 tunes, and potentially sfx and other blocks added.

@christofmuc christofmuc mentioned this issue Feb 2, 2025
@christofmuc
Copy link
Owner Author

Hey, it just took 4 years, but here is a first shot at the Yamaha FS1R.

It can load the MIDI files I found in the internet, and it does create separate entries for performance and voice. Which is confusing, and it doesn't help they are all called "Patch" in the property pane.

But give it a try, it would already be a success if it can autodetect and you can send programs. I have no idea how to query the edit buffer yet.

Yamaha_FS1R.zip

@markusschloesser
Copy link
Collaborator

markusschloesser commented Feb 7, 2025

Fantastic! 🤩

  1. auto-detect does not work
  2. importing from synth only gets ONE patch in midi log, but doesn't import it.
00:05:01.860: Out FS1R DIN 7 Sysex [f0 43 20 5e 10 00 00 f7]
00:05:02.293: In  FS1R DIN 7 Sysex [f0 43 00 5e 03 10 10 00 00 54 65 63 6b 20 48 6f 6f 6b 20 20 20 00 03 0b 05 7f 40 18 00 00 00 01 00 07 68 00 00 00 00 00 00 00 02 00 00 00 00 00 40 0f 0f 0f 0f 0f 00 00 00 20 00 00 01 00 02 00 04 00 08 00 00 00 00 00 00 27 15 16 0f 10 00 00 00 4e 60 49 50 50 40 40 40 0f 50 1f 20 1f 23 1f 26 00 57 00 03 00 03 00 00 00 00 22 04 1a 40 2e 42 00 28 00 19 00 23 27 0c 00 51 00 03 00 03 00 32 00 40 00 00 00 16 00 40 00 30 00 40 00 2e 00 40 00 0a 00 28 00 3c 00 24 00 40 00 25 00 43 00 2f 00 43 00 4c 00 27 00 43 00 0a 00 40 00 01 00 00 0e 40 40 0e 40 40 00 04 40 1e 2c 7f 4a 15 07 01 48 24 07 48 2a 07 01 11 04 02 3f 00 10 00 00 01 0c 29 40 7f 40 40 01 00 7f 7f 00 00 01 40 40 40 7f 40 40 40 3e 40 40 40 40 40 40 40 03 32 42 3e 32 00 01 7f 00 01 40 40 00 00 00 00 04 02 3f 00 10 00 00 01 0c 58 40 64 40 40 7f 00 7f 7f 00 28 01 40 40 40 7f 40 40 40 3e 40 40 40 44 40 40 40 03 32 42 3e 32 00 01 7f 00 01 40 40 00 00 00 00 04 02 3f 00 10 00 00 01 00 2e 40 50 40 40 10 00 7f 7f 00 28 01 40 40 40 7f 40 40 40 40 40 40 40 40 40 40 40 02 32 42 3e 32 00 01 7f 00 01 40 40 00 00 00 00 04 02 3f 00 10 00 00 01 00 52 40 50 40 40 70 00 7f 7f 00 28 01 40 40 40 7f 40 40 40 40 40 40 40 40 40 40 40 02 32 42 3e 32 00 01 7f 00 01 40 40 00 00 00 00 24 f7]
  1. I cannot import a sysex bank from disk. Did you try with a single sound?
  2. Should I be able to import other file types? .mid or so? Because it lists them when trying to do import. There's a brief flashing but then nothing. (might also be nice to show something like "cannot import, don't understand the format"
  3. also tried with single sound, doesn't work?

PS: did you get my mail on sunday wrt k5000s?

@markusschloesser
Copy link
Collaborator

used another editor (https://synth-voice.sakura.ne.jp) and captured what it was doing:
GET first performance: [F0 43 20 5E 10 00 00 F7] (that's what kk is currently doing when getting ALL)
GET Voice 1 [F0 43 20 5E 40 00 00 F7]
GET Voice 2 [F0 43 20 5E 41 00 00 F7]
etc

GET system data F0 43 20 5E 00 00 00 F7

Sounddiver FS1R edition:
When SD scans the midi interfaces for a FS1R it does F0 43 30 5E 00 00 F7, if there is a reply, it iterates through the midi channels (I assume)
Image

this is when it's found:

Image

So FS1R replies with [f0 43 00 5e 00 4c 00 00 00 40 00 00 00 00 00 40 02 01 00 00 00 00 00 00 00 01 00 01 01 01 01 10 11 12 13 14 15 16 0d 04 02 50 51 3c 7f 3c 7f 3c 7f 3c 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 01 00 06 f7]

When getting a Performance Bank:
GET First Performance: F0 43 20 5E 11 00 00 F7
GET second performance: F0 43 20 5E 11 00 01 F7
etc

Image

@christofmuc
Copy link
Owner Author

ooohhkay.

So SD uses a parameter request for detection (with the 0x30, we were using the get settings call. Probably just a speed issue, our message looked correct.

Generally, the import commands constructed look good, the main question is about the split of messages. Can you show a MIDI log for importing the edit buffer, and then another one for importing Bank 1, and one for Bank 2? I need to see the answer from the synth.

The files I used were MID files (KK can import these alright), and they had strangely very large messages in them. Here is one from Planet Groove website:

vdfs1r01.zip

Here is an adaptation unchanged but with a slower auto detect, that normally should work?

Yamaha_FS1R_V2.zip

@christofmuc
Copy link
Owner Author

So I think I need a few more data examples, and we need to decide on the data split. Is one patch always one performance and 4 voices plus voice common? It looks like it, the file above has exactly one performance per voice, and they are even called the same.
Or we split into two different types, the performance and a block of all voices separate?

@markusschloesser
Copy link
Collaborator

So SD uses a parameter request for detection (with the 0x30, we were using the get settings call. Probably just a speed issue, our message looked correct.

Generally, the import commands constructed look good, the main question is about the split of messages. Can you show a MIDI log for importing the edit buffer, and then another one for importing Bank 1, and one for Bank 2? I need to see the answer from the synth.

from kk? because request edit buffer doesn't do anything. bank request already further up (#73 (comment))

The files I used were MID files (KK can import these alright), and they had strangely very large messages in them. Here is one from Planet Groove website:

vdfs1r01.zip

I have all of those, I cannot get KK to import a single one???

Here is an adaptation unchanged but with a slower auto detect, that normally should work?

Yamaha_FS1R_V2.zip

does not work, with only FS1R activated, it looks like this:

12:30:48.013: Out Modal002 DIN 3 Sysex [f0 7e 7f 06 01 f7]
12:30:48.116: Out MPKmini HST 2  Sysex [f0 7e 7f 06 01 f7]
12:30:48.219: Out RD-8 DIN 9 Sysex [f0 7e 7f 06 01 f7]
12:30:48.322: Out DIN 4 Sysex [f0 7e 7f 06 01 f7]
12:30:48.425: Out Alphabase HST3  Sysex [f0 7e 7f 06 01 f7]
12:30:48.527: Out Multi_01IVDIN10 Sysex [f0 7e 7f 06 01 f7]
12:30:48.630: Out MUC400 DIN 5 Sysex [f0 7e 7f 06 01 f7]
12:30:48.733: Out HST 4 Sysex [f0 7e 7f 06 01 f7]
12:30:48.734: In  HST 4 Sysex [f0 7e 7f 06 02 47 49 00 19 00 01 02 06 00 00 00 00 00 45 38 32 33 30 37 32 34 38 37 32 39 39 33 36 00 f7]
12:30:48.837: Out Kijimi DIN 6 Sysex [f0 7e 7f 06 01 f7]
12:30:48.939: Out HST 5-10 Sysex [f0 7e 7f 06 01 f7]
12:30:49.042: Out Prophet12 DIN1  Sysex [f0 7e 7f 06 01 f7]
12:30:49.144: Out FS1R DIN 7 Sysex [f0 7e 7f 06 01 f7]
12:30:49.247: Out USB 2Norns Sysex [f0 7e 7f 06 01 f7]
12:30:49.350: Out Andromeda DIN 2 Sysex [f0 7e 7f 06 01 f7]
12:30:49.453: Out Seaboard HST 1  Sysex [f0 7e 7f 06 01 f7]
12:30:49.556: Out MS-1 DIN 8free Sysex [f0 7e 7f 06 01 f7]
12:30:49.659: Out 01. Internal MIDI Sysex [f0 7e 7f 06 01 f7]
12:30:49.659: In  01. Internal MIDI Sysex [f0 7e 7f 06 01 f7]
12:30:49.762: Out 02. Internal MIDI Sysex [f0 7e 7f 06 01 f7]
12:30:49.762: In  02. Internal MIDI Sysex [f0 7e 7f 06 01 f7]
12:30:49.865: Out 03. Internal MIDI Sysex [f0 7e 7f 06 01 f7]
12:30:49.865: In  03. Internal MIDI Sysex [f0 7e 7f 06 01 f7]
12:30:49.968: Out 04. Internal MIDI Sysex [f0 7e 7f 06 01 f7]
12:30:49.968: In  04. Internal MIDI Sysex [f0 7e 7f 06 01 f7]
12:30:50.071: Out UFX+ MIDI Port 1 Sysex [f0 7e 7f 06 01 f7]
12:30:50.174: Out UFX+ MIDI Port 2 Sysex [f0 7e 7f 06 01 f7]
12:30:50.277: Out UFX+ MADI optical Sysex [f0 7e 7f 06 01 f7]
12:30:50.381: Out UFX+ MADI coaxial Sysex [f0 7e 7f 06 01 f7]
12:30:50.484: Out markus-pc-x64 Sysex [f0 7e 7f 06 01 f7]
12:30:50.587: Out markus-pc-x64_1 Sysex [f0 7e 7f 06 01 f7]

shouldn't it send out something with 43 XX 5E?

@markusschloesser
Copy link
Collaborator

markusschloesser commented Feb 8, 2025

ChatGPT:
Yes, Formant Sequence (FSeq) data is stored and transmitted separately from voice, performance, and system data in the FS1R's SysEx bulk dump format.

FSeq Data in FS1R SysEx

FSeq data is distinct because it contains formant motion data, which is more like a time-based modulation source rather than a traditional patch parameter.

How FSeq Data is Handled in SysEx

The FS1R allows up to 8 custom FSeqs to be stored in memory.

Each FSeq is a complex dataset, including formant amplitude and frequency changes over time.

The SysEx bulk dump for FSeq data is much larger than regular voice data due to the detailed time-series information.

FSeq SysEx Dump Structure

xx refers to the specific FSeq slot (0-7).

The size of each FSeq varies, depending on its length and resolution.

Extracting & Editing FSeq Data

Since Yamaha’s official FS1R editor didn’t expose FSeq editing, most users had to rely on third-party tools or custom SysEx parsing to extract and modify them. The data format isn’t directly compatible with standard audio editors but can be analyzed as a series of control envelope points.

xxxxxxxxxxxxxx

Yes, to fully reconstruct a performance patch on the FS1R, you need to gather multiple SysEx dumps, as the performance itself does not contain all the necessary voice and FSeq data.

Required SysEx Dumps for a Complete FS1R Performance

To fully restore a performance, you need:

  1. Performance Data (Single Performance)

Sub-ID: 20

Address: 03 00 00

Size: ~128 bytes

This contains the performance-level settings, such as effect routing, macro controls, and voice assignments.

  1. Voice Data (Up to 4 Assigned Voices)

Sub-ID: 10

Address: 03 00 00 (for individual voices)

Size: ~128 bytes per voice

The FS1R’s performance mode allows 4 voices per performance, so you must also dump the specific voices assigned in that performance.

  1. Formant Sequence (FSeq) Data (If the performance uses a custom FSeq)

Sub-ID: 50

Address: xx 00 00 (specific FSeq slot)

Size: Variable (~8-32 KB per FSeq)

If the performance references a custom FSeq (not an internal preset), you need to dump and reload the FSeq data separately.


Restoring a Performance from SysEx Dumps

To fully reconstruct a performance patch on another FS1R unit:

  1. Load the Performance SysEx (20 Sub-ID).

  2. Load the 4 voices used in that performance (10 Sub-ID).

  3. Load any necessary FSeq data (50 Sub-ID) if the performance depends on a user-defined FSeq.

If the performance uses only the internal preset FSeqs, you don’t need to send FSeq data, as those are stored in ROM.

xxxxxxxxxxxxxxx

No, the data size for individual voices and performances is larger than 128 bytes. The 128-byte figure was an underestimate. Here’s the correct breakdown:

FS1R SysEx Data Sizes

So for a full performance setup, you need:

216 bytes for the performance itself.

4 × 1904 bytes for the assigned voices (~7616 bytes total).

FSeq dump (if applicable), which can be very large.

xxxxxxxxxxxxxx

So if I understand correctly, we need to find out if the performance features include an internal or external fseq. If internal it needs a reference. If external, include fseq dump? Which varies in size. Can kk do that? (also K5000r /k5000s has variable sizes)

@markusschloesser
Copy link
Collaborator

markusschloesser commented Feb 8, 2025

Also ChatGPT

The Formant Sequence (FSeq) reference—whether it's an internal preset FSeq or a user-defined (external) FSeq—is stored in the Performance SysEx dump. This determines which FSeq is used when playing a performance.


Where is the FSeq Reference Stored?

Location: Inside the Performance Data SysEx (Sub-ID 20)

Data Offset: Byte 48 (0x30 in hex) of the 216-byte Performance Dump

Value Range: 00 – 0F (16 possible values)


How FSeqs Are Referenced in the Performance SysEx

The value at byte 48 (0x30) in the Performance Dump determines which FSeq is used:

If the value is 00–07, the FS1R uses one of its built-in FSeqs.
If the value is 08–0F, it uses a user-defined FSeq stored in RAM.


Restoring an External FSeq

If a performance references an external (user) FSeq (08–0F), then you must also load the correct FSeq SysEx dump (Sub-ID 50). If the corresponding user FSeq isn’t present in RAM, the FS1R may either default to an internal one or fail to play the sequence correctly.

@christofmuc
Copy link
Owner Author

Autodetect - are you sure you are using the correct module here? It should generate a Yamaha Sysex message, not a generic device ID request.

@markusschloesser
Copy link
Collaborator

markusschloesser commented Feb 9, 2025

Autodetect - are you sure you are using the correct module here? It should generate a Yamaha Sysex message, not a generic device ID request.

Pretty certain, will double check again later. But iirc I just extracted your v2 version into the kk adaptation directory

EDIT/Update: @christofmuc I am stupid, I still had an old file (named fs1r instead of yamaha fs1r) in the directory, apologies!!

Update 2: with the now real adaptation, I am getting:

00:25:00: error Adaptation[Yamaha_FS1R]: Error calling channelIfValidDeviceResponse: Exception: Got invalid data block

At:
  C:\Users\Markus\KnobKraft-Adaptations\Yamaha_FS1R.py(195): addressFromMessage
  C:\Users\Markus\KnobKraft-Adaptations\Yamaha_FS1R.py(75): channelIfValidDeviceResponse

Update3:
after running it twice (but still showing a lot of the above errors):
00:30:29: info Found Yamaha FS1R on channel 1 replying on device FS1R DIN 7 when sending to FS1R DIN 7 on channel 1
Log attached:

fs1rKK.log

@christofmuc
Copy link
Owner Author

the Performance common data references which FSeq it uses, in parameters 15, 16, and 17. We need to find out which are the custom fseq numbers, because only for those we need to store the FSeq, all others are FSeq presets.

The Performance Voice data references which Voice is used in parameters 01 and 02, is my guess.

There are two different design coices:

  1. Treat all data items individually, and show them explicitly and their type and their banks. This is like SoundDiver would do it.
  2. What we could do is to treat patches as the sum of a performance, and 4 voices, and optionally an FSeq (if not preset). On send, just send all of the messages and make sure they reference each other correctly. On retrieve, first query the performance and then pull the voices and the fseq, and put all together into one big patch data block.

We have a precedence for 2: the MKS-80 already archives two tones together with one performance, and the K3 already archives a user wave message together with the patch should the patch need it.

Disadvantage of 2: Patches are much bigger (but no problem for the DB), and sending a patch will overwrite a random splash of program slots (unless we allocate and rewrite the positions of voices and fseq separately).

Advantage of 2: When you use only KK and don't care about the synth's RAM, this is much easier to use.

@markusschloesser
Copy link
Collaborator

the Performance common data references which FSeq it uses, in parameters 15, 16, and 17. We need to find out which are the custom fseq numbers, because only for those we need to store the FSeq, all others are FSeq presets.

#73 (comment)

The Performance Voice data references which Voice is used in parameters 01 and 02, is my guess.

There are two different design coices:

  1. Treat all data items individually, and show them explicitly and their type and their banks. This is like SoundDiver would do it.
  2. What we could do is to treat patches as the sum of a performance, and 4 voices, and optionally an FSeq (if not preset). On send, just send all of the messages and make sure they reference each other correctly. On retrieve, first query the performance and then pull the voices and the fseq, and put all together into one big patch data block.

We have a precedence for 2: the MKS-80 already archives two tones together with one performance, and the K3 already archives a user wave message together with the patch should the patch need it.

Disadvantage of 2: Patches are much bigger (but no problem for the DB), and sending a patch will overwrite a random splash of program slots (unless we allocate and rewrite the positions of voices and fseq separately).

Advantage of 2: When you use only KK and don't care about the synth's RAM, this is much easier to use.

I'd say go for 2, but really only do fseq if user fseq, because they can get big (according to ChatGPT) and transferring via midi might otherwise be too slow

@markusschloesser
Copy link
Collaborator

OK, with the now correct py file:

  1. Edit Buffer import half works!
    Midi Log shows this
07:41:50.424: Out FS1R DIN 7 Sysex [f0 43 20 5e 10 00 00 f7]
07:41:50.424: Out FS1R DIN 7 Sysex [f0 43 20 5e 40 00 00 f7]
07:41:50.424: Out FS1R DIN 7 Sysex [f0 43 20 5e 41 00 00 f7]
07:41:50.424: Out FS1R DIN 7 Sysex [f0 43 20 5e 42 00 00 f7]
07:41:50.425: Out FS1R DIN 7 Sysex [f0 43 20 5e 43 00 00 f7]
07:41:50.559: In  FS1R DIN 7 Sysex [f0 43 00 5e 03 10 10 00 00 5a 61 70 20 21 20 20 20 20 20 20 20 00 08 10 0a 78 40 18 00 00 01 01 32 06 60 00 00 00 7f 00 7f 00 02 00 00 00 00 00 40 01 01 01 01 01 00 00 00 21 00 00 01 00 02 00 04 00 08 00 00 00 00 00 00 27 15 16 17 09 00 00 00 45 5e 5e 5e 4f 40 40 40 1a 05 0d 03 27 08 27 08 00 4a 00 64 00 01 00 68 00 00 08 04 1a 40 2e 34 00 0a 00 00 00 63 00 06 00 30 00 13 00 40 00 30 00 40 00 00 00 00 00 00 00 1a 00 40 00 2e 00 40 00 04 00 7f 00 0f 00 41 00 40 00 16 00 42 00 2e 00 40 00 40 00 26 00 48 00 48 00 3c 00 7f 00 00 0d 40 40 10 40 7f 12 0f 40 00 7f 00 4c 13 05 01 40 21 07 4c 2f 07 00 11 04 03 14 7f 10 00 00 01 0c 40 40 3d 40 40 40 00 7f 00 7f 00 01 40 40 40 40 40 40 52 45 40 40 40 40 40 40 40 03 2f 42 3e 32 50 01 7f 00 01 40 40 00 00 00 00 04 00 0d 7f 7f 01 00 00 18 40 40 7f 40 40 40 00 7f 7f 00 28 00 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 02 32 42 3e 32 00 01 7f 00 01 40 40 00 00 00 00 04 00 0d 7f 7f 01 00 00 18 40 40 7f 40 40 40 00 7f 7f 00 28 00 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 02 32 42 3e 32 00 01 7f 00 01 40 40 00 00 00 00 04 00 0d 7f 7f 01 00 00 18 40 40 7f 40 40 40 00 7f 7f 00 28 00 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 02 32 42 3e 32 00 01 7f 00 01 40 40 00 00 00 00 15 f7]
07:41:53.536: In  FS1R DIN 7 Sysex [f0 43 00 5e 04 60 40 00 00 52 65 73 6f 20 53 45 20 20 20 00 00 00 08 10 0b 03 47 00 00 00 00 00 00 00 14 00 00 00 00 18 32 32 32 32 14 14 14 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 32 00 14 15 16 17 00 7f 7f 7f 7f 40 20 22 00 00 00 5e 5e 40 40 40 00 10 07 40 07 00 00 40 3c 0a 00 00 00 00 00 00 7f 00 64 3f 00 00 3c 32 63 00 00 00 18 01 00 00 3d 3f 25 0f 64 32 20 14 63 42 01 00 00 42 00 41 00 00 63 3c 00 00 03 00 00 00 00 3f 07 07 07 18 14 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 00 00 00 38 3f 25 0f 32 64 05 17 63 42 01 00 00 42 00 41 00 00 5a 3c 00 00 03 00 00 00 00 3f 07 07 07 18 14 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 3d 3f 0e 0f 64 32 20 14 63 42 01 00 00 42 00 41 00 00 63 3c 00 00 03 00 00 00 00 3f 07 07 07 18 14 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 3e 3f 07 0f 64 32 20 14 63 42 01 00 00 42 00 41 00 00 63 3c 00 00 03 00 00 00 00 3f 07 07 07 18 14 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 3e 3f 48 0f 64 32 20 14 63 42 01 00 00 42 00 41 00 00 00 3c 00 00 03 00 00 00 00 3f 07 07 07 18 14 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 00 00 00 3d 37 63 0f 64 32 20 14 63 42 01 00 00 42 00 41 00 00 00 3c 00 00 03 00 00 00 00 3f 07 07 07 18 14 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 02 00 00 3e 3f 63 0f 64 32 20 14 63 42 01 00 00 42 00 41 00 00 00 3c 00 00 03 00 00 00 00 3f 07 07 07 18 14 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 04 00 00 3e 3f 4a 0f 64 32 20 14 63 42 01 00 00 42 00 41 00 00 00 3c 00 00 03 00 00 00 00 3f 07 07 07 18 14 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 7b f7]
07:41:56.450: In  FS1R DIN 7 Sysex [f0 43 00 5e 04 60 41 00 00 49 6e 69 74 20 56 6f 69 63 65 00 00 00 00 00 00 00 14 00 00 00 00 00 00 00 14 00 00 00 00 18 32 32 32 32 14 14 14 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 01 00 01 00 00 00 32 00 00 00 00 00 00 40 40 40 40 40 00 00 00 00 00 40 40 40 40 40 00 24 07 55 07 00 00 45 3c 0c 00 00 00 00 00 00 40 32 64 4b 4b 1e 1e 1e 63 00 00 00 18 01 00 00 38 00 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 63 27 00 00 03 00 00 00 00 38 07 07 07 18 0e 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 01 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 0f 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 02 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 0f 4b 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 03 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 10 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 04 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 10 2a 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 05 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 10 4b 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 06 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 10 68 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 07 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 11 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 6b f7]
07:41:59.365: In  FS1R DIN 7 Sysex [f0 43 00 5e 04 60 42 00 00 49 6e 69 74 20 56 6f 69 63 65 00 00 00 00 00 00 00 14 00 00 00 00 00 00 00 14 00 00 00 00 18 32 32 32 32 14 14 14 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 01 00 01 00 00 00 32 00 00 00 00 00 00 40 40 40 40 40 00 00 00 00 00 40 40 40 40 40 00 24 07 55 07 00 00 45 3c 0c 00 00 00 00 00 00 40 32 64 4b 4b 1e 1e 1e 63 00 00 00 18 01 00 00 38 00 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 63 27 00 00 03 00 00 00 00 38 07 07 07 18 0e 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 01 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 0f 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 02 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 0f 4b 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 03 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 10 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 04 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 10 2a 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 05 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 10 4b 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 06 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 10 68 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 07 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 11 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 6a f7]
07:42:02.279: In  FS1R DIN 7 Sysex [f0 43 00 5e 04 60 43 00 00 49 6e 69 74 20 56 6f 69 63 65 00 00 00 00 00 00 00 14 00 00 00 00 00 00 00 14 00 00 00 00 18 32 32 32 32 14 14 14 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 01 00 01 00 00 00 32 00 00 00 00 00 00 40 40 40 40 40 00 00 00 00 00 40 40 40 40 40 00 24 07 55 07 00 00 45 3c 0c 00 00 00 00 00 00 40 32 64 4b 4b 1e 1e 1e 63 00 00 00 18 01 00 00 38 00 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 63 27 00 00 03 00 00 00 00 38 07 07 07 18 0e 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 01 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 0f 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 02 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 0f 4b 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 03 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 10 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 04 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 10 2a 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 05 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 10 4b 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 06 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 10 68 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 07 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 11 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 69 f7]

BUT: not all of it gets stored (successful retrieval message came way too early and pressing "hex dump" shows:

0000 f0 43 00 5e 03 10 10 00 00 5a 61 70 20 21 20 20 20 20 20 20 20 00 08
0017 10 0a 78 40 18 00 00 01 01 32 06 60 00 00 00 7f 00 7f 00 02 00 00 00
002e 00 00 40 01 01 01 01 01 00 00 00 21 00 00 01 00 02 00 04 00 08 00 00
0045 00 00 00 00 27 15 16 17 09 00 00 00 45 5e 5e 5e 4f 40 40 40 1a 05 0d
005c 03 27 08 27 08 00 4a 00 64 00 01 00 68 00 00 08 04 1a 40 2e 34 00 0a
0073 00 00 00 63 00 06 00 30 00 13 00 40 00 30 00 40 00 00 00 00 00 00 00
008a 1a 00 40 00 2e 00 40 00 04 00 7f 00 0f 00 41 00 40 00 16 00 42 00 2e
00a1 00 40 00 40 00 26 00 48 00 48 00 3c 00 7f 00 00 0d 40 40 10 40 7f 12
00b8 0f 40 00 7f 00 4c 13 05 01 40 21 07 4c 2f 07 00 11 04 03 14 7f 10 00
00cf 00 01 0c 40 40 3d 40 40 40 00 7f 00 7f 00 01 40 40 40 40 40 40 52 45
00e6 40 40 40 40 40 40 40 03 2f 42 3e 32 50 01 7f 00 01 40 40 00 00 00 00
00fd 04 00 0d 7f 7f 01 00 00 18 40 40 7f 40 40 40 00 7f 7f 00 28 00 40 40
0114 40 40 40 40 40 40 40 40 40 40 40 40 40 02 32 42 3e 32 00 01 7f 00 01
012b 40 40 00 00 00 00 04 00 0d 7f 7f 01 00 00 18 40 40 7f 40 40 40 00 7f
0142 7f 00 28 00 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 02 32 42 3e
0159 32 00 01 7f 00 01 40 40 00 00 00 00 04 00 0d 7f 7f 01 00 00 18 40 40
0170 7f 40 40 40 00 7f 7f 00 28 00 40 40 40 40 40 40 40 40 40 40 40 40 40
0187 40 40 02 32 42 3e 32 00 01 7f 00 01 40 40 00 00 00 00 15 f7

Which is only the PERFORMANCE, but not the VOICES.
So kk sends the sysex for Performance plus Voices 1-4, but only stores Performance?

  1. "Import all" successfully finishes all PERFORMANCES, but stalls at 99% for VOICES, when cancelling, nothing gets imported
  2. Importing only PERFORMANCES , works (but don't know if that's enough, see previous discussion)
  3. Importing only VOICES doesn't even start, stays at 0%

@christofmuc
Copy link
Owner Author

Ok, it's expected it's not all stored, I just store the performance. I just wanted to see if it buffers the requests so you could request all of once. Seems you can.

Why VOICE recall doesn't work surprises me. Can you show the MIDI log from the (non-working) VOICE bank download? We might send out a message, and it might reply with something unexpected?

@markusschloesser
Copy link
Collaborator

markusschloesser commented Feb 11, 2025

Ok, it's expected it's not all stored, I just store the performance. I just wanted to see if it buffers the requests so you could request all of once. Seems you can.

👍

Why VOICE recall doesn't work surprises me. Can you show the MIDI log from the (non-working) VOICE bank download? We might send out a message, and it might reply with something unexpected?

09:02:33.151: Out FS1R DIN 7 Sysex [f0 43 20 5e 51 00]
and then nothing,
probably because sysex not complete, VOICE NUMBER and F7 missing. If I add those in sysex window, it works
TBH I tried to understand why this is not send, but failed
Also sometimes detection still fails, but the second times works, timing?

@markusschloesser
Copy link
Collaborator

markusschloesser commented Feb 11, 2025

couple of things about the adaptation:

  1. typo in VOICE_EDIT_BUFFFER_PART1 there's too many f, but consistently :-)
  2. it has 4 PERFORMANCE banks: Internal, A, B, C. All are 128 so a total of 512 performances.
    Only INTERNAL is RAM, the others are ROM
  3. VOICES: The FS1R includes a total of 12 voice banks (a total of 1,536 voices). INTERNAL is RAM, the other 11 are ROM
  4. Fseq (Formant Sequence) ROM: Presets 90, RAM: Internal 6 (max)

Would this be correct?

def bankDescriptors():
    return [{"bank": 0, "name": "Performances Internal", "size": 128, "type": "Performance", "isROM": False, },
            {"bank": 1, "name": "Performances A", "size": 128, "type": "Performance", "isROM": True, },
            {"bank": 2, "name": "Performances B", "size": 128, "type": "Performance", "isROM": True, },
            {"bank": 3, "name": "Performances C", "size": 128, "type": "Performance", "isROM": True, },
            {"bank": 4, "name": "Voices Internal", "size": 128, "type": "Voice", "isROM": False, },
            {"bank": 5, "name": "Voices A", "size": 128, "type": "Voice", "isROM": True, },
            {"bank": 6, "name": "Voices B", "size": 128, "type": "Voice", "isROM": True, },
            {"bank": 7, "name": "Voices C", "size": 128, "type": "Voice", "isROM": True, },
            {"bank": 8, "name": "Voices D", "size": 128, "type": "Voice", "isROM": True, },
            {"bank": 9, "name": "Voices E", "size": 128, "type": "Voice", "isROM": True, },
            {"bank": 10, "name": "Voices F", "size": 128, "type": "Voice", "isROM": True, },
            {"bank": 11, "name": "Voices G", "size": 128, "type": "Voice", "isROM": True, },
            {"bank": 12, "name": "Voices H", "size": 128, "type": "Voice", "isROM": True, },
            {"bank": 13, "name": "Voices I", "size": 128, "type": "Voice", "isROM": True, },
            {"bank": 14, "name": "Voices J", "size": 128, "type": "Voice", "isROM": True, },
            {"bank": 15, "name": "Voices K", "size": 128, "type": "Voice", "isROM": True, },
            ]

Fuck, it seems that Yamaha didn't implement requesting other than INTERNAL for all 3 types. Neither can one initiate a dump for ROM from the fs1r itself 🙄🤬

@markusschloesser
Copy link
Collaborator

markusschloesser commented Feb 12, 2025

so chatgpt drew me this nice overview:

Performance Bank Voices FSEQ RAM/ROM
Internal (RAM) Internal (RAM) Internal (RAM) Fully RAM
Internal (RAM) VOICES A-K (ROM) Internal (RAM) Mixed (RAM Perf, ROM Voice, RAM FSEQ)
Internal (RAM) Internal (RAM) Preset (ROM) Mixed (RAM Perf, RAM Voice, ROM FSEQ)
Internal (RAM) VOICES A-K (ROM) Preset (ROM) Mixed (RAM Perf, ROM Voice, ROM FSEQ)
A, B, C (ROM) Internal (RAM) Internal (RAM) Mixed (ROM Perf, RAM Voice, RAM FSEQ)
A, B, C (ROM) VOICES A-K (ROM) Internal (RAM) Mixed (ROM Perf, ROM Voice, RAM FSEQ)
A, B, C (ROM) Internal (RAM) Preset (ROM) Mixed (ROM Perf, RAM Voice, ROM FSEQ)
A, B, C (ROM) VOICES A-K (ROM) Preset (ROM) Fully ROM

Key Points:

  • Internal Performance (RAM) allows any combination of RAM/ROM Voices and FSEQ.
  • ROM Performances (A, B, C) remain ROM but can reference RAM Voices and RAM FSEQ, leading to mixed configurations.
  • A Fully ROM setup occurs when a ROM Performance references only ROM Voices and ROM FSEQ.

ME:
So as we cannot request nor send ROM (Perf, Voice, FSEQ), only the first line of the table makes sense to implement, correct?
Edit Buffer though works for all 3 data types.
Does it make sense to , for now, only ever send to edit buffer?

@christofmuc
Copy link
Owner Author

My head is swimming. Ignoring Fseq for now.

So my take so far on idea 2) is:

i) An edit buffer always (?) are 5 messages: One performance and 4 voice parts.

ii) A performance can reference 0 to 4 user voices.

  • If a performance only refrences ROM voices, 411 bytes are enough, we only need to store the performance message.
    For each voice the performance references, we need another mesage of 619 bytes each.

iii) When loading a bank, we load 128 performances and 128 voices. Those voices might be shared by performances, and there might be non-referenced "orphaned" voices in the bank as well. (Same with the MKS-80).

iv) The bank loader will always produce 128 performances of varying size. Orphaned voices will be lost.

v) We will not change the storage position of the voices, when sending it to the synth we will send the voices to the original storage locations (which are referenced by the peformance), potentially overwriting the voices of other performances. To improve on that, you need separate bank management for voices and performances.

vi) When we convert an edit buffer to a program buffer, we just assign arbitrary voice program positions to the max 4 user voices. When sending that to the synth, a voice is potentially duplicated.

vii) When converting a program buffer to an edit buffer, we also need to load each user voice into an edit buffer voice. But how do we send the ROM voices? Do they need to be sent to the synth, or will it pull them from ROM because the performance references the ROM? I hope the latter.

@markusschloesser
Copy link
Collaborator

But how do we send the ROM voices? Do they need to be sent to the synth, or will it pull them from ROM because the performance references the ROM? I hope the latter.

We cannot send them, because we cannot even get them!

More later

@christofmuc
Copy link
Owner Author

Here is an experimental version that tries to treat the voices as discussed for design 2) - they are just additional data items for performances. Bank import should work. FSeq is ignored for now.

You need to install 2.5.2 released just now for the bank import to work.

Yamaha_FS1R_V3.zip

@markusschloesser
Copy link
Collaborator

markusschloesser commented Feb 12, 2025

alright, as I was using this issue as an idea pad (btw hope thats ok for you?), let me summarize my current thinking and answer your questions:

ii) A performance can reference 0 to 4 user voices.

  • If a performance only refrences ROM voices, 411 bytes are enough, we only need to store the performance message.
    For each voice the performance references, we need another mesage of 619 bytes each.

according to the sysex spec:
Performance Parameter
Byte Count
common 80
effect data 112
part data 52 x 4 = 208

total 400


Performance Part Parameter (Byte Count : 52 x 4 = 208 bytes )
F0 43 1n 5E 3p 00 11 vv vv F7 p = 0..3 (Part1..3)
11 vv vv Description
...
01 00-0C BANK NUMBER off, Int, Preset Bank A ~ Preset Bank K
02 00-7F PROGRAM NUMBER 0~127


btw part of that is FSEQ
Performance Common Parameter (Byte Count: 80 bytes)
F0 43 1n 5E 10 00 11 vv vv F7
11 vv vv Description
.....
15 00-04 FSEQ PART (0: off, 1~4: part)
16 00-01 FSEQ bank 0: int, 1: pre
17 00-59 FSEQ number int (0-5) , pre (0-89)
......

The way I (currently) see it is that we need to parse the Performance first (byte 01), in order to know if Voices are off, internal (and then to be requested) or ROM, in which case we cannot request them and they are just referenced. The same goes for FSEQ (byte 15 and 16) (ah shit, just saw that you wrote exactly this 3 days ago 😂)

@christofmuc
Copy link
Owner Author

Yes, that's what I implemented!

@markusschloesser
Copy link
Collaborator

markusschloesser commented Feb 12, 2025

Here is an experimental version that tries to treat the voices as discussed for design 2) - they are just additional data items for performances. Bank import should work. FSeq is ignored for now.

You need to install 2.5.2 released just now for the bank import to work.

Yamaha_FS1R_V3.zip

immediately crashes kk when trying to request. Nothing in Windows Event Viewer, any way to debug?

Edit Buffer request works though.

Do you wanna know something that makes the whole thing even more funny/weird/strange? ;-)
I stumbled over Yamaha using the word "current" instead of just saying "edit buffer", so I just selected a ROM performance on the synth and edit buffer requested it and voila, I got everything 🤯😂

and one more: If you edit buffer request a ROM Performance in which only Voice 1 is active, the currently implemented request still gets 4 Voices even if they are inactive (don't know which voices it gets)

@markusschloesser
Copy link
Collaborator

markusschloesser commented Feb 13, 2025

Edisyn is able to download the ROM Performances??? I'm gonna try to find out how.
seems that it is program changing to each of the Performances and then requesting it.
Ah yes, see https://github.com/eclab/edisyn/blob/e63f4839be77fcfc57bd9f4e55c91b229ef31688/edisyn/synth/yamahafs1r/YamahaFS1R.java#L3652

@christofmuc
Copy link
Owner Author

I would have thought that you could get the ROM via the edit buffer, so I am not surprised - it has to load them in order to play them. Same for all Roland synths (XV- JV- etc)

The empty voices - not sure how to detect they are off. They have bank 1 program 0, which I thought must be active. But then, the values are not really documented. Do you have an example of a performance with 1 voice active and another with 4 voices active?

Crash - strange, I need to dig.

Did you try loading a file?

@markusschloesser
Copy link
Collaborator

The empty voices - not sure how to detect they are off. They have bank 1 program 0, which I thought must be active. But then, the values are not really documented. Do you have an example of a performance with 1 voice active and another with 4 voices active?

If I read that correctly 0 means off
"00-0C BANK NUMBER off, Int, PrA~PrK"

@christofmuc
Copy link
Owner Author

Yes, that's what I use. But the performances I saw have bank = 1 and program = 0. Which is why I asked for a patch as example.

Crash was found, will build 2.5.3 with fix.

@markusschloesser
Copy link
Collaborator

Ah sorry, will provide later (currently watching the little one)

@markusschloesser
Copy link
Collaborator

markusschloesser commented Feb 13, 2025

A001 "Zap !" has Part 1 active with Voice preset "Reso SE", Parts 2,3,4 are off. Edisyn shows this also. Perf Sysex from Edisyn attached

Zap-!.zip
strangely enough when I only request A001 and capture this in MIDI-OX it shows

 0001D32B  FS1 --     F0  Buffer:   256 Bytes   System Exclusive
 SYSX: F0 43 00 5E 03 10 10 00 00 5A 61 70 20 21 20 20 20 20
 SYSX: 20 20 20 00 08 10 0A 78 40 18 00 00 01 01 32 06 60 00
 SYSX: 00 00 7F 00 7F 00 02 00 00 00 00 00 40 01 01 01 01 01
 SYSX: 00 00 00 21 00 00 01 00 02 00 04 00 08 00 00 00 00 00
 SYSX: 00 27 15 16 17 09 00 00 00 45 5E 5E 5E 4F 40 40 40 1A
 SYSX: 05 0D 03 27 08 27 08 00 4A 00 64 00 01 00 68 00 00 08
 SYSX: 04 1A 40 2E 34 00 0A 00 00 00 63 00 06 00 30 00 13 00
 SYSX: 40 00 30 00 40 00 00 00 00 00 00 00 1A 00 40 00 2E 00
 SYSX: 40 00 04 00 7F 00 0F 00 41 00 40 00 16 00 42 00 2E 00
 SYSX: 40 00 40 00 26 00 48 00 48 00 3C 00 7F 00 00 0D 40 40
 SYSX: 10 40 7F 12 0F 40 00 7F 00 4C 13 05 01 40 21 07 4C 2F
 SYSX: 07 00 11 04 03 14 7F 10 00 00 01 0C 40 40 3D 40 40 40
 SYSX: 00 7F 00 7F 00 01 40 40 40 40 40 40 52 45 40 40 40 40
 SYSX: 40 40 40 03 2F 42 3E 32 50 01 7F 00 01 40 40 00 00 00
 SYSX: 00 04 00 0D
 0001D35C  FS1 --     F7  Buffer:   155 Bytes   SysEx End       
 SYSX: 7F 7F 01 00 00 18 40 40 7F 40 40 40 00 7F 7F 00 28 00
 SYSX: 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 02 32 42
 SYSX: 3E 32 00 01 7F 00 01 40 40 00 00 00 00 04 00 0D 7F 7F
 SYSX: 01 00 00 18 40 40 7F 40 40 40 00 7F 7F 00 28 00 40 40
 SYSX: 40 40 40 40 40 40 40 40 40 40 40 40 40 02 32 42 3E 32
 SYSX: 00 01 7F 00 01 40 40 00 00 00 00 04 00 0D 7F 7F 01 00
 SYSX: 00 18 40 40 7F 40 40 40 00 7F 7F 00 28 00 40 40 40 40
 SYSX: 40 40 40 40 40 40 40 40 40 40 40 02 32 42 3E 32 00 01
 SYSX: 7F 00 01 40 40 00 00 00 00 15 F7

which is different to what is in the sysex file above?? (might be too late for me 😇😂)

this is what kk gets

07:34:25.943: Out FS1R DIN 7 Sysex [f0 43 20 5e 10 00 00 f7]
07:34:25.943: Out FS1R DIN 7 Sysex [f0 43 20 5e 40 00 00 f7]
07:34:25.943: Out FS1R DIN 7 Sysex [f0 43 20 5e 41 00 00 f7]
07:34:25.943: Out FS1R DIN 7 Sysex [f0 43 20 5e 42 00 00 f7]
07:34:25.943: Out FS1R DIN 7 Sysex [f0 43 20 5e 43 00 00 f7]
07:34:26.079: In  FS1R DIN 7 Sysex [f0 43 00 5e 03 10 10 00 00 5a 61 70 20 21 20 20 20 20 20 20 20 00 08 10 0a 78 40 18 00 00 01 01 32 06 60 00 00 00 7f 00 7f 00 02 00 00 00 00 00 40 01 01 01 01 01 00 00 00 21 00 00 01 00 02 00 04 00 08 00 00 00 00 00 00 27 15 16 17 09 00 00 00 45 5e 5e 5e 4f 40 40 40 1a 05 0d 03 27 08 27 08 00 4a 00 64 00 01 00 68 00 00 08 04 1a 40 2e 34 00 0a 00 00 00 63 00 06 00 30 00 13 00 40 00 30 00 40 00 00 00 00 00 00 00 1a 00 40 00 2e 00 40 00 04 00 7f 00 0f 00 41 00 40 00 16 00 42 00 2e 00 40 00 40 00 26 00 48 00 48 00 3c 00 7f 00 00 0d 40 40 10 40 7f 12 0f 40 00 7f 00 4c 13 05 01 40 21 07 4c 2f 07 00 11 04 03 14 7f 10 00 00 01 0c 40 40 3d 40 40 40 00 7f 00 7f 00 01 40 40 40 40 40 40 52 45 40 40 40 40 40 40 40 03 2f 42 3e 32 50 01 7f 00 01 40 40 00 00 00 00 04 00 0d 7f 7f 01 00 00 18 40 40 7f 40 40 40 00 7f 7f 00 28 00 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 02 32 42 3e 32 00 01 7f 00 01 40 40 00 00 00 00 04 00 0d 7f 7f 01 00 00 18 40 40 7f 40 40 40 00 7f 7f 00 28 00 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 02 32 42 3e 32 00 01 7f 00 01 40 40 00 00 00 00 04 00 0d 7f 7f 01 00 00 18 40 40 7f 40 40 40 00 7f 7f 00 28 00 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 02 32 42 3e 32 00 01 7f 00 01 40 40 00 00 00 00 15 f7]
07:34:29.035: In  FS1R DIN 7 Sysex [f0 43 00 5e 04 60 40 00 00 52 65 73 6f 20 53 45 20 20 20 00 00 00 08 10 0b 03 47 00 00 00 00 00 00 00 14 00 00 00 00 18 32 32 32 32 14 14 14 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 32 00 14 15 16 17 00 7f 7f 7f 7f 40 20 22 00 00 00 5e 5e 40 40 40 00 10 07 40 07 00 00 40 3c 0a 00 00 00 00 00 00 7f 00 64 3f 00 00 3c 32 63 00 00 00 18 01 00 00 3d 3f 25 0f 64 32 20 14 63 42 01 00 00 42 00 41 00 00 63 3c 00 00 03 00 00 00 00 3f 07 07 07 18 14 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 00 00 00 38 3f 25 0f 32 64 05 17 63 42 01 00 00 42 00 41 00 00 5a 3c 00 00 03 00 00 00 00 3f 07 07 07 18 14 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 3d 3f 0e 0f 64 32 20 14 63 42 01 00 00 42 00 41 00 00 63 3c 00 00 03 00 00 00 00 3f 07 07 07 18 14 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 3e 3f 07 0f 64 32 20 14 63 42 01 00 00 42 00 41 00 00 63 3c 00 00 03 00 00 00 00 3f 07 07 07 18 14 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 3e 3f 48 0f 64 32 20 14 63 42 01 00 00 42 00 41 00 00 00 3c 00 00 03 00 00 00 00 3f 07 07 07 18 14 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 00 00 00 3d 37 63 0f 64 32 20 14 63 42 01 00 00 42 00 41 00 00 00 3c 00 00 03 00 00 00 00 3f 07 07 07 18 14 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 02 00 00 3e 3f 63 0f 64 32 20 14 63 42 01 00 00 42 00 41 00 00 00 3c 00 00 03 00 00 00 00 3f 07 07 07 18 14 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 04 00 00 3e 3f 4a 0f 64 32 20 14 63 42 01 00 00 42 00 41 00 00 00 3c 00 00 03 00 00 00 00 3f 07 07 07 18 14 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 7b f7]
07:34:31.950: In  FS1R DIN 7 Sysex [f0 43 00 5e 04 60 41 00 00 49 6e 69 74 20 56 6f 69 63 65 00 00 00 00 00 00 00 14 00 00 00 00 00 00 00 14 00 00 00 00 18 32 32 32 32 14 14 14 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 01 00 01 00 00 00 32 00 00 00 00 00 00 40 40 40 40 40 00 00 00 00 00 40 40 40 40 40 00 24 07 55 07 00 00 45 3c 0c 00 00 00 00 00 00 40 32 64 4b 4b 1e 1e 1e 63 00 00 00 18 01 00 00 38 00 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 63 27 00 00 03 00 00 00 00 38 07 07 07 18 0e 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 01 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 0f 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 02 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 0f 4b 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 03 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 10 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 04 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 10 2a 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 05 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 10 4b 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 06 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 10 68 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 07 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 11 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 6b f7]
07:34:34.864: In  FS1R DIN 7 Sysex [f0 43 00 5e 04 60 42 00 00 49 6e 69 74 20 56 6f 69 63 65 00 00 00 00 00 00 00 14 00 00 00 00 00 00 00 14 00 00 00 00 18 32 32 32 32 14 14 14 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 01 00 01 00 00 00 32 00 00 00 00 00 00 40 40 40 40 40 00 00 00 00 00 40 40 40 40 40 00 24 07 55 07 00 00 45 3c 0c 00 00 00 00 00 00 40 32 64 4b 4b 1e 1e 1e 63 00 00 00 18 01 00 00 38 00 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 63 27 00 00 03 00 00 00 00 38 07 07 07 18 0e 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 01 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 0f 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 02 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 0f 4b 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 03 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 10 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 04 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 10 2a 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 05 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 10 4b 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 06 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 10 68 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 07 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 11 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 6a f7]
07:34:37.778: In  FS1R DIN 7 Sysex [f0 43 00 5e 04 60 43 00 00 49 6e 69 74 20 56 6f 69 63 65 00 00 00 00 00 00 00 14 00 00 00 00 00 00 00 14 00 00 00 00 18 32 32 32 32 14 14 14 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 01 00 01 00 00 00 32 00 00 00 00 00 00 40 40 40 40 40 00 00 00 00 00 40 40 40 40 40 00 24 07 55 07 00 00 45 3c 0c 00 00 00 00 00 00 40 32 64 4b 4b 1e 1e 1e 63 00 00 00 18 01 00 00 38 00 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 63 27 00 00 03 00 00 00 00 38 07 07 07 18 0e 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 01 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 0f 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 02 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 0f 4b 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 03 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 10 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 04 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 10 2a 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 05 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 10 4b 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 06 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 10 68 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 18 01 00 00 38 07 14 0f 32 32 14 14 63 63 63 00 00 14 14 00 00 00 00 27 00 00 03 00 00 00 00 38 07 07 07 18 11 00 00 14 07 00 32 32 14 14 00 07 63 63 63 00 00 14 14 00 00 00 07 07 07 07 69 f7]

The question is if it is relevant? Do you store everything you get?

@markusschloesser
Copy link
Collaborator

I would have thought that you could get the ROM via the edit buffer, so I am not surprised - it has to load them in order to play them. Same for all Roland synths (XV- JV- etc)

Do you plan to do the same?

But then, the values are not really documented.

You do have this file?

yamaha_fs1r_datalist_EN.pdf

@markusschloesser
Copy link
Collaborator

with 2.5.3 and v3 of the adaptation I can request all and it doesn't crash. It takes 20 min (to be expected), but then shows:
00:41:52: warning No patches contained in data, nothing to upload.
And nothing gets saved
log attached, disregard the first 10 lines (was edit buffer request)

kkFs1r14.02.2025.log

@christofmuc
Copy link
Owner Author

I have looked at this forwards and backwards, and can't find the problem. The requests are good, the data is good, it loads when I subject it to the load routine. Something must be off somewhere. What we can do is to be more precise about which voice buffers are required, but that would not make a difference with this download.

Scratching head.

@markusschloesser
Copy link
Collaborator

chatgpt says:

From the log, I can see that KnobKraft is correctly sending SysEx requests to the Yamaha FS1R and receiving responses. However, the imported data doesn't seem to be recognized correctly in KnobKraft.

Possible Issues:

  1. Device ID Mismatch

    • The responses contain 0x43 00 5e, which matches the expected Yamaha FS1R SysEx header.
    • However, DEVICE_ID_DETECTED is dynamically set in your script based on channelIfValidDeviceResponse(). If KnobKraft is not using the correct detected ID, requests and responses might not align properly.
  2. Edit Buffer vs. Program Dump Handling

    • The script attempts to classify dumps as either edit buffer dumps or program dumps.
    • isSingleProgramDump() is used to verify completeness. If some voices are missing from the responses before classification, KnobKraft might reject the dump.
    • Some received messages contain voice references, but _extractReferencedUserVoices() might not extract them correctly.
  3. Checksum Issues

    • recalculateChecksum() ensures the messages are valid. If a checksum is incorrect after modifications, KnobKraft might reject the import.
    • Try logging the recalculated checksums and comparing them with expected values.
  4. Bank Dump Completion Detection

    • isBankDumpFinished() checks whether all expected performances and voices were received.
    • Your log suggests that multiple patches are received (e.g., "Tick Hook", "Yes No", "Sitar"), but KnobKraft may not be identifying them as a full bank.

Debugging Steps:

  • Log DEVICE_ID_DETECTED and confirm it matches the FS1R's response.
  • Verify isSingleProgramDump() output to see if all voices referenced in performances are present.
  • Print extracted voice addresses from _extractReferencedUserVoices().
  • Manually compute checksums and compare them with recalculated ones in recalculateChecksum().

Would you like me to modify the script to add debug output?

is this helpful?

@christofmuc
Copy link
Owner Author

Yamaha_FS1R.py.zip

Try this one!

@markusschloesser
Copy link
Collaborator

I would have thought that you could get the ROM via the edit buffer, so I am not surprised - it has to load them in order to play them. Same for all Roland synths (XV- JV- etc)

Do you plan to do the same?

?
Then we could use my bank descriptions further above

@markusschloesser
Copy link
Collaborator

Yamaha_FS1R.py.zip

Try this one!

It works! 😊 💪👍

@christofmuc
Copy link
Owner Author

Wow, just like that? It also collects less than 4 voices for the edit buffer if not 4 user voices are used.

Then it seems we could extend this whole thing for the fseqs? Basically doing the same thing as for the voices - if they are referenced, request them and store them together with the performance.

@christofmuc
Copy link
Owner Author

For the ROM banks we need feature #391

@markusschloesser
Copy link
Collaborator

markusschloesser commented Feb 16, 2025

Wow, just like that? It also collects less than 4 voices for the edit buffer if not 4 user voices are used.

Then it seems we could extend this whole thing for the fseqs? Basically doing the same thing as for the voices - if they are referenced, request them and store them together with the performance.

But it only gets the performances, intentional?
What about the voices?
(I need to properly check, but can only do later)
Update midi log attached, only performances

kfs13.log

@christofmuc
Copy link
Owner Author

True - the data shows none of the patches retrieved references the voice bank 1. They reference voices all over the place (0, 2, 3, 4, 5, 9, 11, 12) but not a single program uses bank 1 (user voice). Can this be?

@markusschloesser
Copy link
Collaborator

True - the data shows none of the patches retrieved references the voice bank 1. They reference voices all over the place (0, 2, 3, 4, 5, 9, 11, 12) but not a single program uses bank 1 (user voice). Can this be?

probably, will edit on synth and then request, but we might have another problem. I imported the 512 presets that edisyn edit buffer requested. kk shows info Retrieved 383 new or changed patches from the synth, uploaded to database no errors or duplicate warning.

  1. should edit buffer and program request of the same patch be identical with the current Adaptation?
  2. I now have duplicates of presets and they ARE different, for example
    0000 f0 43 00 5e 03 10 11 00 **34** 34 2d 33 2d 32 2d 31 20 20 20 20 20 00 00 0017 10 00 7f 40 18 00 00 01 01 33 04 5a 00 00 00 7f 00 7f 00 02 00 00 00 002e 00 00 60 06 01 02 01 01 01 04 00 20 08 00 01 00 04 04 02 20 08 00 04 0045 00 08 00 00 2b 24 11 25 2e 11 19 00 43 50 5f 49 43 21 3d 40 00 12 00 005c 0a 00 08 00 0d 00 31 00 00 00 00 00 00 00 00 00 04 32 08 40 00 00 4c 0073 00 7f 00 20 00 05 00 00 00 15 00 40 00 2e 00 4c 00 00 00 00 00 00 00 008a 00 00 00 00 00 00 00 00 3c 00 22 00 40 00 0a 00 46 00 19 00 2e 00 00 00a1 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 40 40 0a 40 40 16 00b8 15 40 0a 00 7f 40 0c 07 00 40 22 07 40 34 07 00 00 04 03 79 00 10 01 00cf 00 00 0c 40 38 7f 40 40 40 00 7f 7f 00 20 00 40 40 40 40 40 40 40 40 00e6 40 40 40 40 40 40 40 02 32 42 3e 32 00 01 7f 00 01 40 40 00 00 00 00 00fd 04 0c 61 00 10 01 00 01 18 40 40 64 3c 2d 40 00 7f 7f 14 08 00 44 40 0114 40 4a 4f 40 40 5f 40 40 40 40 40 40 40 02 32 42 3e 32 00 01 7f 00 01 012b 40 40 00 00 00 00 04 0c 02 00 10 01 00 00 0c 40 40 66 3a 3c 40 00 7f 0142 7f 08 40 00 3e 5c 47 40 40 4a 41 44 40 7f 40 40 40 40 40 02 32 42 3e 0159 32 00 01 7f 00 01 40 40 00 00 00 00 04 00 06 7f 7f 01 00 00 18 40 40 0170 7f 40 40 40 00 7f 7f 00 28 00 40 40 40 40 40 40 40 40 40 40 40 40 40 0187 40 40 02 32 42 3e 32 00 01 7f 00 01 40 40 00 00 00 00 51 f7
    and
    0000 f0 43 00 5e 03 10 11 00 **77** 34 2d 33 2d 32 2d 31 20 20 20 20 20 00 00 0017 10 00 7f 40 18 00 00 01 01 33 04 5a 00 00 00 7f 00 7f 00 02 00 00 00 002e 00 00 60 06 01 02 01 00 01 04 00 20 08 00 01 00 04 04 02 20 08 00 04 0045 00 08 00 00 2b 24 11 25 2e 11 19 00 43 50 5f 49 43 21 3d 40 00 12 00 005c 0a 00 08 00 0d 00 31 00 00 00 00 00 00 00 00 00 04 32 08 40 00 00 4c 0073 00 7f 00 20 00 05 00 00 00 15 00 40 00 2e 00 4c 00 00 00 00 00 00 00 008a 00 00 00 00 00 00 00 00 40 00 22 00 40 00 32 00 40 00 13 00 34 00 00 00a1 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 01 40 40 0a 40 40 16 00b8 15 40 28 00 7f 40 0c 07 00 40 22 07 40 34 07 00 00 04 03 79 05 00 01 00cf 00 00 0c 40 38 7f 40 40 40 00 7f 7f 00 20 00 40 40 40 40 40 40 40 40 00e6 40 40 40 40 40 40 40 02 32 4c 34 32 00 01 7f 00 01 40 40 00 00 00 00 00fd 04 0c 61 05 00 01 00 01 18 40 40 64 3c 2d 40 00 7f 7f 14 08 00 44 40 0114 40 4a 4f 40 40 5f 40 40 40 40 40 40 40 02 32 4c 34 32 00 01 7f 00 01 012b 40 40 00 00 00 00 04 0c 02 05 05 01 00 00 0c 40 40 66 3a 3c 40 00 7f 0142 7f 08 40 00 3e 5c 47 40 40 4a 41 44 40 7f 40 40 40 40 40 02 32 4c 34 0159 32 00 01 7f 00 01 40 40 00 00 00 00 04 00 00 7f 7f 01 00 00 18 40 40 0170 64 40 40 40 00 7f 7f 00 28 00 40 40 40 40 40 40 40 40 40 40 40 40 40 0187 40 40 02 32 4c 34 32 00 01 7f 00 01 40 40 00 00 00 00 07 f7
    see bolded 34 and 77
  3. where are the missing 129 if nothing was shown in the log?

@christofmuc
Copy link
Owner Author

  1. Edit buffer and program request should be identical, if the voice pull was correct. Ideally, you can provide me two hex dumps and I can check?

  2. Duplicate - the highlighted position is the program number, which should be ignored when determining if two patches are requal, so I'd say those are duplicates?

  3. Was the database empty? Because it only gives duplicate warnings when more than one instance is in the current download. If it already is in the database, it is silently ignored. I'd need the full log to verify.

Moreover: We can also implement two different bank download methods, once to iterate over program buffers and fetch only voices that are referenced (current mode), and secondly to just collect 128 performances and 128 voices, and import spare voices as single voice dumps. Then we have different types of patches inside the database, will make things more interesting.

We need #391 to allow that, and we need #306 to allow building the 256 messages from a list of performances with their voices, with automatic memory management for the voices.

@christofmuc christofmuc added the Ready for release Will be part of the next release label Feb 23, 2025
@christofmuc
Copy link
Owner Author

Released the current version with 2.6.0. What is missing apart from the fseq data?

@christofmuc christofmuc removed the Ready for release Will be part of the next release label Feb 23, 2025
@markusschloesser
Copy link
Collaborator

Released the current version with 2.6.0. What is missing apart from the fseq data?

#391 and #306 and I need to check of performance with user voice pulls the user voice

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

3 participants