D-110 again #564
Replies: 115 comments 257 replies
-
this is what Steinberg Synthworks looked like .. http://www.muzines.co.uk/images_mag/articles/sos/SOS_89_03_steinberg_d1_large.jpg http://www.muzines.co.uk/images_mag/articles/sos/SOS_89_03_steinberg_d1_2_large.jpg another editor for D10; |
Beta Was this translation helpful? Give feedback.
-
the old panel project had loads of individual methods; i realised it all had to be rewritten to work in a multitimbral context. the envelopes are here: and here are the old bits for the Patch and Rhythm sections collected, though i'm figuring out how to represent and manage 'Timbre', which evidently will require its own memory banks, 2x64. basically, it is a Timbre, rather than a Tone, that is assigned to a Part, with a Tone assigned and saved to that Timbre. (thus when saving, you also have to remember to save the Timbre as well) |
Beta Was this translation helpful? Give feedback.
-
found out something interesting yesterday that cleared up a couple of questions about the D-110 'Timbre' and 'Patch' memories, which isn't very obvious: i'd assumed you had to save every change to a Part (each channel in the multi/'Patch') by saving the Timbre, and then saving the Patch. this is not the case. it seems that the Timbres A11-88/B11-88 are a separate set of memories, that you call up on 'Parts', but you can edit 'Part parameters' and save the Patch directly, and it will keep those changes, without having to store the Timbres. i was assuming something like the 'Part' parameters being offsets of the settings saved in the Timbre - since they all seem to be reproduced, if you look at the manual p118 sections 5-5-1 and 5-2. rather, the Part parameters replace the Timbre parameters, so they will save when you just save Patch. at least this is what it looks like, pending further investigation. that simplifies things somewhat in terms of general Save procedure. what happens is, say you have a Timbre assigned, with its Tone and Bank, and you change the Tone number, then save Patch, it will come back with that. however it isn't saved into a Timbre, so if you then try another Timbre on that channel, eg: the next one in the list, and then go back, your patch-saved edit isn't in the list: you'd have to refresh the whole Patch to get that saved edit back. i don't know if that's clear, try it, but it means you can edit your Patch with new Tones and save it without interfering with the Timbre list, which is more like a separate Timbre library. obviously you can edit and save Timbres, but you don't have to. this a/ clears up a couple of questions i had about the sysex and b/ makes operation a bit simpler. |
Beta Was this translation helpful? Give feedback.
-
I am replying in this discussion because the other thread is getting too long: 😄
So an example of a sysex message could be The two methods are:
where You can also access them in the 'expressions' field. |
Beta Was this translation helpful? Give feedback.
-
Okay! Phew! A few errors in all and any of those panels. Hopefully this one works! |
Beta Was this translation helpful? Give feedback.
-
hey ran into a little issue with my selector buttons that call tabs: i get the last character of the name to ID the button, and it works fine up to 9, but what do you do above that, if you want 11 buttons ?! current method:
|
Beta Was this translation helpful? Give feedback.
-
To format a number as a hex string with two characters such as you would see in a binary string or
... should output Incidentally you can also use the bit library: so
would be
|
Beta Was this translation helpful? Give feedback.
-
Try this code: partSelect = function(mod,value,source) -- This stops issues during panel bootup if panel:getRestoreState() or panel:getProgramState() then return end local NAME=L(mod:getName()) local part = (tonumber(string.sub(NAME,-2))) --button led highlight colours local colour = {"FF00FF00","FF1291DF"} -- scan buttons and assign button text colours for i = 1,11 do local paddedStr=string.format("%.2d",i) local partMod=string.format("partSel%s",paddedStr) local button = panel:getComponent(partMod) if part == paddedStr then -- if part == i -1 then button:setProperty("uiButtonTextColourOff",colour[1], false) else button:setProperty("uiButtonTextColourOff",colour[2], false) end end -- Show tabs local tab1 = panel:getComponent("tabs_Patch"):setPropertyInt("uiTabsCurrentTab", part) end |
Beta Was this translation helpful? Give feedback.
-
Here are the waveforms for the D110 - I did some OCR scanning! |
Beta Was this translation helpful? Give feedback.
-
You can convert an image with text into data! Object Character Recognition I think. |
Beta Was this translation helpful? Give feedback.
-
I got it from a screengrab of sounddiver. I guess they would have to go into a |
Beta Was this translation helpful? Give feedback.
-
It might be possible with lookAndFeel - I will have a look. |
Beta Was this translation helpful? Give feedback.
-
Patch Part_5_6_bug_2023-08-24.zip just a little look at how that works so far. it's a bpanelz this time, so you get the LAsynth TTF font ;-) a lot of work to follow copying all the Tone parameters and their containers .. 'copy with children' only goes down one level, anything beyond that is left behind, so lots of deconstruction, and then rebuilding. deferring doing that until i have a better idea of what's going on with the rest. (nb: this is nothing like a final design or anything like that, just seeing how it falls into place for now) |
Beta Was this translation helpful? Give feedback.
-
This code fixes your button changing to a static orange problem; bit of a hack to suit how you did it, but I would probably have a separate function for partSelect = function(mod, value, source) if source ~= 4 then return end -- This stops issues during panel bootup if panel:getRestoreState() or panel:getProgramState() then return end local NAME = L(mod:getName()) if NAME == "partSel00" then panel:getComponent("tabs_Patch"):setPropertyString("uiTabsCurrentTab", string.sub(NAME, -2)) return end local t = { "partSel01", "partSel02", "partSel03", "partSel04", "partSel05", "partSel06", "partSel07", "partSel08" } for i, v in ipairs(t) do if v ~= NAME then panel:getComponent(v):setValue(0, false) else panel:getComponent(v):setValue(1, false) end end -- loop -- Show tabs panel:getComponent("tabs_Patch"):setPropertyString("uiTabsCurrentTab", string.sub(NAME, -2)) end Also I think your |
Beta Was this translation helpful? Give feedback.
-
Here is full code for switching partials! The correct byte offset is stored in Includes full generation of sysex including checksum: To use this code in your panel, all you need to do is substitute your partial button names for the ones I have in You'll need to include the timer code to prevent tab callback from firing on load. EDIT: (updated pairs to ipairs)__ 08/25/2023 switchPartial = function(--[[ CtrlrModulator --]] mod --[[ number --]], value --[[ number --]], source) if panel:getBootstrapState() then return end if source ~= 4 then return end local tabIndex= panel:getComponent('tones'):getProperty("uiTabsCurrentTab") or 0 local t = partial_lookup_tab[tabIndex] local sum = 0 local bytePosition = tonumber(panel:getModulatorByName(t[1]):getProperty("modulatorCustomIndex")) -- byte Position for i, v in ipairs(t) do local mult = bit.lshift(1, i - 1) local value = panel:getComponent(v):getValue() or 0 sum = tonumber(sum + (value * mult)) end local msb, lsb = ret14bit(bytePosition) local s = sf("F0 41 10 16 12 04 %.2x %.2x %.2x 00 F7", msb, lsb, sum) local m = MemoryBlock() m:loadFromHexString(s) local cs = checkSumMb(m, 5, 4) m:setByte(9, cs) panel:getLabelComponent("debug"):setText(m:toHexString(1)) bytePosition,m = nil,nil end function ret14bit(n) local msb, lsb = math.modf(n / 128), bit.band(n, 127) return msb, lsb end checkSum = function(...) -- Roland Checksum passing in Table local sum = 0 local result = 0 for _, v in ipairs(arg) do sum = sum + v end return bit.band(bit.bnot(sum) + 0x01, 0x7F) -- using Yamaha Checksum formula which returnes same result end --function checkSumMb = function(m, offset, bytes) -- Roland Checksum passing in MemoryBlock local offset = offset or 0 local bytes = bytes or m:getSize() - 1 local sum = 0 local result = 0 for i = offset, bytes + offset do sum = sum + m:getByte(i) end return bit.band(bit.bnot(sum) + 0x01, 0x7F) end --function |
Beta Was this translation helpful? Give feedback.
-
ah found solution for 'red thumb'. put the following in the two other methods, at the end. seems to work:
|
Beta Was this translation helpful? Give feedback.
-
next, the dread step of replacing those buggy wave/bank select modulators. had a great chat with ChatGPT yesterday. prompts can be verging on conversational, if you are structured about it. and the responses coming back gave good suggestions and context. i ought to post the last exchange. still need to check the code it offered (should i say 'they' LOL). if you start with something that's working, and ask it to optimise it, you can get some interesting results. |
Beta Was this translation helpful? Give feedback.
-
here's the waveform/PCM bank select bug again, in an exploded view - before i change it - to show what's happening, and try to identify what the problem is. D110 Elements_1_117_PCM exploded view.zip wondering if it's one of the many unused methods i have in the Lua list; have put a startup blocker in all of them now, in case. (intend to clean up all that Lua in next stage) ignore the Patch view it opens with, and go to Tone1 page, and set all the partials to 'P' (PCM) inc/dec on all of them reaches 64 and changes the bank in other words, pretty messed up. |
Beta Was this translation helpful? Give feedback.
-
decided to have a look-see what else was happening for the D-110 and came across this: ... ok so now what is MidiDesigner .. i've sidestepped this .. i'm trying to challenge my attachment to my own layout - which i might have got bogged down with. am really bugged by my bug with the wave/pcmBank linked modulators, and this other bug that makes the pcmList switch another modulator halfway through its count (wtf!!???) - does not occur in the mini panel i extracted them to, and i can't find the cause in the project panel grrrrr >:-/ so meanwhile i reduced those random/reset buttons to one set, relying on selected uiTabs instead of getting name and substring. ..at which point >>>> rabbithole of reducing the entire thing to a single set of modulators, and doing the rest in programming and table-collecting/restoring, for multiples of the same set of modulators (eg: as per RX7 panel, that was a nightmare of n00b subfunctions) - conclusion: meh not at this point ;-) and then there's edisyn there were a couple of oldskool editors, one of which had a library of 5000 presets - LA WIN32 and something else (have to look in the archive) but they don't run on win10 - haven't tried with WINE, worth a try. |
Beta Was this translation helpful? Give feedback.
-
(back to work on this, after a little recess trying to find the source of some annoying bugs) i tried to 'get partial, get part' by using uiTab tab index, as below, but it crashes on opening, on tab index 0, of course.
|
Beta Was this translation helpful? Give feedback.
-
i removed ALL the methods that weren't being used directly. the linked combos bug persists. :-( so now.. either have to delete and re-import/re-create these modulators, .. not something i do lightly .. eg: find/construct an alternative to using Ctrlr's 'linked modulator' thing. |
Beta Was this translation helpful? Give feedback.
-
Here is some suggested code as an alternative to Ctrlr's linked modulator from interface: There are three modulators in the panel
changeMaster = function(--[[ CtrlrModulator --]] mod --[[ number --]], value --[[ number --]], source) if panel:getBootstrapState() then return end local t = {A = "B", B = "A"} local n = L(mod:getName()) panel:getComponent(t[n]):setValue(value, false) _t.MASTER:setValue(value, true) end _t={} _t.MASTER = panel:getComponent("MASTER") |
Beta Was this translation helpful? Give feedback.
-
have now managed to make a 'common' envelopes display, which adapts to whichever partial and part is selected, based on tab number, and they do not crash on start thanks to your jmax suggestion ! but what was i thinking of, deleting a large folder of Lua methods LOL would be nice to be able to 'export Lua' on single methods, or groups of methods. |
Beta Was this translation helpful? Give feedback.
-
this is working, preventing crashes with tab index less than 1 - how do you now include jmin() to prevent crash when tab index exceeds 8? remember now why i did it as a single uiTabs: because these are 'pages', rather than a 'container' - if that distinction makes any sense. the Patch view deals with all the 'Timbre' parameters and selection, and the 'Part Parameters' which are part of the Patch, but not included in Timbre parameters ...yes, nightmare. but it sort of makes sense if you think of timbres as templates you load the 'Tone' preset into, and a separate set of memories. so a 'Patch' will generally be an assignment of 8 Timbres, assigned across the 8 parts, and you save Patch to any of the patch locations. or else: so Timbres are channel setup presets, i guess you could see it like that. you're not bound to the Tone/ToneGroup selection, or any of the other Part parameters, as long as you save the Patch. meaning you don't have to religiously save new Timbres every time, which is a relief, because i tried doing that and it's a nightmare. however you do have to save Tone edits to a Tone, obviously. although : the cool thing about the D110 is that it has temporary buffers for each part and edited tone, so you can have several edits active, power cycle the machine, and it will come back as it was, until you refresh the Patch selection, which will wipe all the edits. another interesting thing about the D110 is that if you press the 'enter' button during tone editing, it will send out the short sysex message for that parameter with its current value. jolly useful if you're doing an arrangement and want to chuck in a parameter change. |
Beta Was this translation helpful? Give feedback.
-
|
Beta Was this translation helpful? Give feedback.
-
oh yeah :-) remembered how to change tab background colour:
... very useful.
|
Beta Was this translation helpful? Give feedback.
-
here's the manifestation of that bug again. i promise this is the last time i post it ! BUT something very strange happened when i created two new buttons: these now ALSO control the combo on the first row ! what is going on? ... to make these buttons, i copied the 'env mode' button, and de-selected the method, removed customIndex etc. - and figured that was ok, without having to re-do style and size. maybe not a good idea. don't need these anyway, it was just to look at. but very odd that they control the bottom 'faulty modulator'. wonder what that could be. YES: maybe it might be a good time to rebuild some modulators, or even reconstruct it in a new file, keeping the Lua ? i have a nagging feeling that "-- None" might have become something - because i had to type it in as a property in the Modulator List, as a Link Property, as was not offered once existing one was removed. (maybe should just be left empty. but all other entries have "none".) here's the file to look at anyway, if anyone can spot anything: (go to Tone1, and it's the new grey buttons on the left; they will toggle the first row at the bottom; not supposed to. also other rows there affect the top row.) |
Beta Was this translation helpful? Give feedback.
-
here is a little panel with fresh combo modulators - to purge anything i might have introduced in those 'old modulators' -dating back to 1st versions of the main file- the top row are reciprocally linked pairs of modulators: left side is the waveform/bank select parameter - which alternates, depending on whether it's a 'synth' or PCM waveform, selected by the 'Structure' algorithm parameter. so in practice, you see one or other of the pair, but not both ( controlled by this is a step before i re-import the new set of combos into the main panel. but before i do, maybe consider another way to do it, that would not rely on Ctrlr 'link modulators', and could bypass the problem of having one sysex parameter address/deal with 2 modulators in the panel. i just built this very literally when i started out, thinking 'duh... what's going on here', and trying to reflect that in a relatable way onscreen. one remaining thing though: i'm pretty sure the inc/dec count used to loop both ways. now it only loops incrementing - this is something i nicked from another panel ages ago - |
Beta Was this translation helpful? Give feedback.
-
something else: had a look at popup menus again, as a possible way of selecting waveforms - to see if i could iterate a popup from a table, and indeed you can:
but i'd like to know how to change background colour and header colour: |
Beta Was this translation helpful? Give feedback.
-
well i'm giving up on changing PopupMenu background for the time being, as it doesn't seem to be possible to get at JUCE LookAndFeel at present. but i still have get the REAL contents of the (Timbre Select) popup ( which is currently using a test list ). i looked at the JV1010 panel. that is a much more complex structure for patches and expansions. so: s'pose i must load the *.syx file into midiOx and copy out all the hex bytes, which ... ? go in a memory block? (sorry for trotting out my mental junk here! not had a lot of time for this lately so i'm catching up) (haven't even finished replacing the linked modulators yet, have to do that before i forget what i was doing - ah yes, i was looking at alternatives, hence the possibility of using popups for that) |
Beta Was this translation helpful? Give feedback.
-
i've had this project on the go forever. it started off as a basic Tone edit panel sending sysex 1-way, on one midi channel, and then i worked on it in various stages, and ended up with this but it's a muddle, still focused around a single tone edit pages, and needs restructuring from the ground up, to be a proper multitimbral editor.
edit:
Chapter 1 : picking up old project
Chapter 2 : 27/10/2023: #564 (comment)
Chapter 3 : 06/01/2024: bugs #564 (comment)
NewStructure v152_1_0_newbuild_2023-07-16_20-22.zip
i'm in 2 minds about the layout, it just evolved like that, and i thought it would be useful for editing adjacent 'partials', thinking about the role of those parameters - that's the way it is for now anyway.
and in fact this version is now dumped because it got to a dead-end where it needed rebuilding from the ground up. i've taken all the individual elements and have rewritten them to be copied out to the other parts without having individual methods - trying to keep file size down.
it has temporary memory area for each of the multitimbral parts, for Tone, and for Timbre (see manual p118-119)
http://cdn.roland.com/assets/media/pdf/D-110_OM.pdf
Beta Was this translation helpful? Give feedback.
All reactions