Forum Replies Created
-
AuthorPosts
-
in fact, i’m still trying to refine behaviour of
the Pad select method – it works but can be condensed
a bit.it gets a bit complicated trying to introduce ‘multi’,
so that the last selected voice gets mapped to the top
12 pads, because those then get a different set of values
and voice assignments.it means introducing an ‘if’ statement somewhere, dependent
on the state of the single/multi button. if i put it in the
wrong place, method gets broken.here’s the sysex results i’ve got from it so far, to have
a look at the format:
(this is what i discovered reading off messages with my lazy
technique of hitting ‘enter’ and picking them up with midiox)voice bulk dump (voice #00, BD1):
43 Bytes:(highlighted voice number with asterisks)F0 43 00 0B 00 23 4C 4D 20 20 38 35 31 35 56*00*02 78
36 07 11 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 36 F7single parameter message:
(‘??’ was where i found variations, i think; must be msb)
F0 43 10 03 51 V# pp ?? vv F7eg:(value byte as per what i found with this voice)
voice edit/job 02-05
decay F0 43 10 03 51 41 01 19 F7
brate F0 43 10 03 51 41 02 00 F7
bRange F0 43 10 03 51 41 03 00 F7
level F0 43 10 03 51 41 04 36 F7
pan F0 43 10 03 51 41 05 08 F7
(etc.)
and here’s what happens with negative values,
eg: pan:repeat pan: -14<>+14
(4th repeat,pan = 14h (param byte)F0 43 10 03 51 41 14 72 F7 > 72h-7Fh = <-14 - -01<0>
(last values)
F0 43 10 03 51 41 14 0E F7 > 00h-0Eh = <0> – +14>
(first values)…
just to have a look. can’t remember off top of my head
what i concluded from the -/+ parameters, but it made
sense seen as a midiox list.
right, i’m off to make a little fader with a message
on it to see if i can get the RX7 to respond.uh ok; not so far. i’ll try again (except i ain’t got
nuffink to say today)ok i think i see: ‘messages’, yeah? not terribly obvious
once you get in there: used to have a list of recipients/members.also, i thought i’d deleted old messages, but they still seem
to be there.hey i had a very weird display when i opened the Ctrlr dll
the other day, like it’s displaced/offset right and down.
this was just opening it empty without a panel loaded.this was Orion on win10 – i don’t recall observing this before.
indeed!
i have read this kind of sysex doc’ before, so
i’m fairly confident i can figure something out,
and ‘cheat’ with the Enter button for quick
visual confirmation in midiox.haha we’ll see though 🙂
i did decide to set it to one side while i worked
out if i could do my tables thing: very valid for
things like drum machines where you get lots of
repetition. remains to be seen what will happen
when sysex-time comes. i’ll probably be calling out
for help then, to get some sort of timed-release
message thing set up.Hi Poss’
the cool thing about the RX7 is that it will send its
last-edited parameter when you press the ‘enter’ button,
so i figured i could reverse-engineer from that, and i
have done a list already of all the messages.you are no doubt right about working out that routine,
and this is perhaps the point where i must look at that.
i wanted to figure out the overall structure of how the
panel would work first, thought that was an important
decision, ie: to have my tables system, or make individual
modulators for … (120 x (21+12))x2 parameters ! (which
i want to avoid)figuring out the multi-voice is the last step i need to
get through before i attempt the sysex. but maybe i should
try to get a message to it first and see what happens, yes.i tend to not sit with the device next to me, connected to
Ctrlr – mainly because i’ve been learning Lua primarily.
this tables build/retrieve system is quite adventurous for me.
time to pull out the RX7 🙂 and i would really appreciate
your input as i attempt to make a rock-solid sysex
send/receive system, as it could go horribly wrong crashing
an old slow box like this. (it’s easy to do a factory reset
though) – it will be a few day yet before i have something
to show there, and in the meantime, i have a couple of users
responding on yamahablackboxes group, to talk about this
multi-voice mode. most confusing system, i must say…Checking the screenshots of the Soundquest editor may be interesting. The interface is as ugly as it gets but you can see the editable parameters.
You can see that there are two midi modes. One spreads all voices on the keyboard and You can edit for each of the 100 voices at which note it should play. This way you can trigger more than one voice per note. The other mode assigns a voice on each midi channel. It will then play one voice spread across the whole keyboard.
It’s probably possible to switch mode by sysex messages.https://www.squest.com/Products/MidiQuest11/Instruments/YamahaRX7/index.html
interesting interpretation. i admit i wasn’t seeing it quite like that.
but i have not at all used the Multi job, or had the RX7 connected to
a MIDI keyboard yet.i just assume that ‘multi voice/yes’ assigns the current pad’s voice to
the top row of 12 pads. until now i have been focusing on regular drum
machine mode, where, as i see it, the 1OO Voices can be assigned to
any Pad/Key, as many times as you want, with the ‘Key Assign’ parameters
defining MIDI IN Note and Channel, and somehow, MIDI OUT Note and Channel.
the manual and service manual are not very clear about this.i need to check it out with a midi keyboard plugged into it.
have a new version here.
pad select method just redone, unpacking subfunctions,
then condensing(could go further; it stops working if
i change too much in one go. just realised i now have
to do this with the other main methods too)once again, the idea is to use a few modulators to
show data from many parameter groups, so it’s more
of an experiment than a panel project (if it ever gets
that far).next hurdle is how to make the current voice the ‘multi’
voice: with the rx5 and 7, when editing, you’re offered
the choice to make that voice the multi voice, spread
across the top 12 pads. (not figured out yet…)little check that system is working:
if you randomise the voice on any pad, and then go to another
pad, and call up the same voice there, the parameters will
jump to the same settings when you click on the new pad.
(have to make that automatic)
of course: it’s the same voice table it’s being updated with.Attachments:
You must be logged in to view attached files.so that didn’t make any difference, but maybe it will
when it comes to sending out midi values?but i did root out where the console triggers were coming
from: 2 groups of controls are updating and triggering their
respective valueChange methods, hence multiple triggers.so far, each time a slider is moved, it rebuilds the value
table (maybe it should be narrowed down to that key, but
haven’t got that far) – so there’s something to recall
when each pad is clicked.mystery solved. (still leaves question of how to prevent
unwanted midi messages going out when recalling settings)project is here:
- This reply was modified 6 years ago by human fly.
oh. can i even do that? nothing under component, so …
did you say setValue rather than setModulatorValue?
can try that. what is the difference?Do you using some labelChanged callbak? So when you change something , callback is trigerred which is changing uiLabel wchich again triggers the callback.
a-ha: this was good. not labelChanged, but valueChanged: all the modulators
jump to position and change value when a button is clicked, and the method
they trigger – which i completely forgot about , because it’s in another
Folder – is triggering the rogue console prints.so i suppose i’m changing the wrong thing when i’m recalling values from
the table. it should be a component property, so value change doesn’t
fire the method.was able to re-order and reduce the script before ‘unpacking’ it.
some things were happening twice. still full of things happening
twice. but runs snappier now.ok, here’s a working unpack of the little subfunctions.
it reaches the end and then spews out a load of console
stuff that isn’t even in it. very weird. so it’s something
in the panel. see below for version.
(“kbmidi()” is nothing to worry about – deals with another
part of the panel)function padSelect(mod,value) -- This variable stops index issues during panel bootup if panel:getRestoreState() == true or panel:getProgramState() == true then return end -- ------------------------------------------------------ psub=nil --[ pad number ]-- local padName= L(mod:getName()) psub=tonumber(string.sub(padName,4)) -- ------------------------------------------------------ kitnmbr =nil --[ kgetcolour ]-- local tbl_kitcolour={} for i=1,5 do local kitcolour=panel:getComponent("keydata"..i-1):getProperty("uiButtonTextColourOff") table.insert(tbl_kitcolour,kitcolour) -- if tbl_kitcolour~="FF1291DF" then kcolourB = tbl_kitcolour --[ for psetcolour ]-- kcolourA ="FF1291DF" --[ for psetcolour ]-- end -- if kcolourB == tbl_kcolourB then --[ see utilTables ]-- kitnmbr = i-1 --[ get current kit number ]-- --[ offset to 0-4 ]-- end end -- ------------------------------------------------------ local tbl_pads={} --[ psetcolour ]-- for i=1,24 do local pad=panel:getModulatorByName("pad"..i) table.insert(tbl_pads,pad) if i ~= psub then tbl_pads[ i ] :getComponent():setProperty("uiButtonTextColourOff",kcolourA, false) else tbl_pads[ psub ]:getComponent():setProperty("uiButtonTextColourOff",kcolourB, false) --[ change tab etc ]-- --panel:getComponent ("tabs_voiceEdit"):setPropertyInt("uiTabsCurrentTab", psub-1) -- or i-1 end end console(String("setpcolour")) --..padselct..":"..psub)) -- ------------------------------------------------------ kitselct=nil --[ findkit ]-- for i=1,5 do local kitcolour=panel:getComponent("keydata"..i-1):getProperty("uiButtonTextColourOff") if kitcolour~="FF1291DF" then kitselct = i end end console(String( "kit:"..kitselct)) -- ------------------------------------------------------ padselct=nil --[ findpad ]-- for i=1,24 do local padcolour=panel:getComponent("pad"..i):getProperty("uiButtonTextColourOff") if padcolour~="FF1291DF" then padselct = i end end console(String( "pad:"..padselct)) -- ------------------------------------------------------ keyselct=nil --[ KeyAssign number, global ]-- --[ keynumber ]-- keyselct = (tbl_bankoffset[ kitselct ]+padselct) console(String("keyselct:"..keyselct)) -- ------------------------------------------------------ local voice=(_G["tbl_keyassgn"..keyselct]) [ 1 ] --[ get voice number ]-- vnmbr=nil --[ global? ]-- vname=nil --[ global? ]-- vnmbr= (_G["tbl_keyassgn"..keyselct]) [ 1 ]+1 --[ vnmbr:1st param ]--[ offset for index 0-99]-- vname= tbl_voiceName[ vnmbr ] --[ get text voice name ]-- --[ update display ]-- panel:getComponent("labl_VoiceNmbr"):setPropertyString("uiLabelText","voice "..voice..":"..vname) panel:getComponent("lcd_paramval"):setPropertyString("uiLabelText","voice "..voice..":"..vname) console(String("updateVoiceName: "..voice..":"..vname)) -- ------------------------------------------------------ for i,v in ipairs ((_G[ "tbl_keyassgn"..keyselct ]),1) do --[ fetchKeyTable ]-- local param = tbl_keyParam param:setModulatorValue(v,false,false,false) end -- local ktblconcat =nil ktblconcat = table.concat(_G["tbl_keyassgn"..keyselct]," ") panel:getComponent("lcd_top2"):setPropertyString("uiLabelText",ktblconcat) console(String("fetchKeyTable:"..ktblconcat)) -- ------------------------------------------------------ for i=1,21 do --[ fetchVoiceTable ]-- local param = tbl_voiceParam[ i ] param:setModulatorValue((_G[ "tbl_voice"..vnmbr ])[ i ],false,false,false) -- local vparam =_G["tbl_voice"..vnmbr][ i ] table.insert(_G["tbl_voice"..vnmbr],vparam) end --- local vtblconcat =nil vtblconcat = table.concat(_G["tbl_voice"..vnmbr]," ") panel:getComponent("lcd_top3"):setPropertyString("uiLabelText",vtblconcat) console(String("fetchVoiceTable:"..vtblconcat)) -- ------------------------------------------------------ panel:getComponent("lcd_top1"):setProperty("uiLabelText", --[ displaypad ]-- "pad "..(tbl_padalpha[psub])..":".." kit:"..kitnmbr.." key:"..keyselct.." voice ".. (vnmbr-1)..":"..vname.." midi:"..tbl_initNoteNo[ vnmbr ],false) -- ------------------------------------------------------ kbdmidi() -- ------------------------------------- end
Attachments:
You must be logged in to view attached files.aaagh – tried to unpack functions back into the method,
now i’ve broken it…start again.reinstated console messages to check where it got up
to, and it’s always the same thing that makes it loop
through. maybe it needs to.changed some things round, and got different patterns
of repeats.got lost now, so back to last good version.
trying to make a readable version.
(so much for putting it all in separate functions)does the same thing with:
for i,v in ipairs ((_G[ "tbl_keyassgn"..keyselct ]),1) do local param = tbl_keyParam param:setModulatorValue(v,false,false,false) end
so it seems to be forcing the previous functions to run for each
time it needs the ‘keyselct’ variable. something like that.
i’m ok with skipping the function calls and putting the code back
in there instead. but i don’t know if it will fix it as it is.it is definitely this that is doing it.
can anyone suggest an alternative way?
‘keyselect’ is the id number of each key assignment,
and the _G table contain all the values that need to
be retrieved.
is it maybe the way that ‘keyselect’ is obtained, by
finding which pad (1-24) and which kit (0-5), performing
separate iterations? is there an art to this? or do i just
have to run through it as many times as needed? ( i put the
console command in as a marker, to check for loops like this )for i=1,12 do local param = tbl_keyParam --param:setModulatorValue((_G[ "tbl_keyassgn"..keyselct ])[ i ],false,false,false) param:setValue((_G[ "tbl_keyassgn"..keyselct ])[ i ],true,true) end
thanks for looking through it.
yes, of course – s’pose i knew some problems could
arise by doing that. and some of it was thrown together
with those series of functions, just getting things
to work.sort of experimenting with the library thing. don’t know
if it has downsides compared to just having separate
methods – does it have to run through the whole thing
each time it wants that function?discovered that the
_G [ .. ]
tables have to be created at
startup, or it doesn’t work – tried without, to see if it was
creating doubles of those tables.they are created on startup, filled with default values,
and then each time something is changed, the table for that voice,
or key, is initialised and rebuilt ie: filled with current display
values. when a pad with that Voice is clicked, values from the
corresponding _G table are sent to their modulators – so the dispay
jumps to that pad’s settings.which sort of seems to work – as a way of avoiding having hundreds
of tabs each with 20 or more modulators.if you want to look at the panel it is here:
v.0.91
https://app.box.com/s/jmy8wa2ij0bqmpwsiu8l34ioy4ehzzssat the moment, it is a UI for a drum machine, with pads
recalling parameter values and displaying voice names etc.
it’s experimental for me – so advance apologies if my
attempt to structure it via a Function Library seems strange.
overall this seems to be working ok, except this retriggering
of one console command with pretty much every panel operation.note that i use the term debugging very loosely, don’t
know exactly what that means technically. i’m ‘fault-finding’.it seems that as ‘keyselct’ is global, ie: not local
and i’m looking for an index in a ‘global’ table, with:
(_G[ "tbl_keyassgn"..keyselct ])[ i ]
there is an issue there. as these are created on start-up,
they already exist, and not nil.i will try it with fewer iterations to see what happens.
nb: this does not seem to affect the operation of the UI;
but sometimes there does seem to be a refresh delay, as if
‘something’ as going on. generally, it seems fast enough.
but if this is going to cause problems further down the line,
with sysex messages triggered 20x, obviously that is no good.i will think about the structure of my code again. it’s definitely
that bit that’s doing it. i’ll look to see if it happens elsewhere.
all the other console commands i’ve re-activated only trigger once.Hi,
not a problem with midi yet because that bit still
isn’t done – this is just debugging the panel generally. -
AuthorPosts