-
Notifications
You must be signed in to change notification settings - Fork 27
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
Have an example synth adaptation and other documentation suggestions for adaptations #245
Comments
@markusschloesser I understand you, and I think we circle back to your suggestion at #59. One problem the adaptation author has is terminology - there is no clear consistent naming of things across the synth vendors, so the first thing that needs to be determined is how to map the synths capabilities to the Orm's capabilities. Then yes, I though I had made a flow chart at some point to decide which functions to implement and which not, but I can't seem to recall it right now. My original advice would be something like 'first determine the type of synth and find an adaptation of a similar type'. Like, it is a mid-80s device with simple one message per patch, then go and look and DW8000 or Matrix 1000. If it is a simple bank dump, go look at Kawai K3. But then, already the DX-7 is totally funky with having to decode bitfields from bank dumps to arrive at individual patches... We should add to the list the point about testing, as this has evolved over the time a lot and by now I have a fairly standard working model. What is missing is definitely the sequence diagrams on how the internal Librarian component works and which functions are called in which order. I need to revisit the C++ code myself to remember how these functions work together at times, so it would be good to document. And yes, PyCharm is the IDE I would recommend, there is a Community Version. What we could do is to identify maybe the three or four major types of synths, and identify a recommeneded example synth for each. Plus, mentioning that just as in the SoundDiver days, some vendors are so consistent with their implementation that we have a generic Sequential and a generic Roland adaptation that should make implementing these much easier. This could also go together with the other suggestions to simplify the Python interface, and to move to classes for the adaptations instead of the old module mechanics, because these make importing easy but all other tasks hard, e.g. testing and subclassing. On the other hand, I don't want to start working on KnobKraft 3.0 just yet before we have even stabilized 2.0 with the bank management features. |
I had completely forgotten about that one! :-)
Understood and agreed. Maybe something like a Glossary?
I think that would be really helpful! Maybe you can find it again?
I am not up to speed on the testing part (yet)
Fully agreed! For me that would be most beneficial!
That's what I'm using. We could also put hints in the doc about certain plugins (e.g. Tabnine) and Python versions
😁👍 |
I've tried to do that with my latest adaptation for Yamaha YC -- take a look and see if this helps. |
@christofmuc I'll continue in here:
|
Thank you! Do you know how to open a pull request for these changes? Then it is easy for me to review and accept/amend. |
I do, but still need an answer to 3 (and 2 b and c from first post), also do I need convertToProgramDump or not? |
You do not need edit buffer if you have either program dump or bank dump. Since KnobKraft 2.0 we have bank management capabilities, and convertToProgramDump is required and used. isOwnSysex is a pattern and not a requirement. I was thinking of making it an official API function for #284, to "sniff" the synth when trying to load any sysex file. So as of today, isOwnSysex is not required, it is just a helper function I like to call the same in every adaptation I do. extractPatchesFromBank you only need if you want to load banks. If you only load single programs, there is no need to implement it. |
Have a look at my adaptations. I've tried to add lots of comments in each which might assist here. |
Here's another question: currently I only have program dumps working. When I now implement bank dump requests as well, which function will kk use when doing get patches from synths? Might makes sense to distinguish program and bank requests?
|
This is actually complex. When getting a full bank is too slow, you could define smaller virtual banks. The logic chooses the "best"way to do it, which is
StreamLoad and HandshakeLoad are only available to C++ code. You can see that the first thing it checks if the synth has a preferred way to circumvent this logic - and you can do that by implementing the python function
to prevent the bank dump mechanism to be the default. This is the place where we could add the bank number to retrieve different banks with different methods. (for the ROM banks) |
I seem to struggle a lot writing adaptations and thought about what would make it easier for me. Here are my ideas:
a) For example the device detection code is not needed for somebody who will just manually select to correct ports.
b) Do I need an edit buffer in the module? Documentation suggests that I can also use a Program Dump, but iirc other parts say one needs an edit buffer, which is counter intuitive when a synth doesn't have an edit buffer. So for example the Waldorf Pulse does not have sysex for "edit buffer request" but can only do "single program requests" or "multiple program requests", but if you send it a "single program" back, it will go to the edit buffer of the synth, whereas if you send "multiple program" back, it will directly overwrite everything.
c) Do I need
extractPatchesFromBank
if I receive multiple patches in response to a "multiple program requests" or "bank dump request"?d) If synth only has numbers, I don't need any naming features, correct?
e) maybe something like a decision tree?
What's your thought on this?
I can try to start with some things, but as I still lack knowledge, I probably cannot tackle everything (see questions above :-) )
The text was updated successfully, but these errors were encountered: