Forum Replies Created
-
AuthorPosts
-
Update time!
Testers for v2 wanted
I am getting v2 on the rails, but development is slower than anticipated due to the code being better, but requiring more work for each control. I do have a working “engine” and a handful of controls implemented, and would like to start testing “in the wild” to see if it works as expected for everyone.
You can find the beta panel and a text document with some info and tester’s guidelines here:
The panel will be updated every once in a while, i will bump this thread & higlight the changes then.
Cheerz,
Hec
Fix confirmed in 1448 win32 , all working again as expected 🙂
Bigup Atom for the ninja-speed-debugging!Cool!
I am working @ home this week so am sitting next to my gear – will check it out tomorrow inbetween study sessions and keep you posted.Rock on!
I’m gonna be glad when i can release v2 of the emu panel too, and after that imme do something simpler than a sampler – something with fixed amounts of …eeerrr… everything 🙂
I encountered the same kind of problem and got around it by using a variable that is created in the “called when panel has finished loading” script, and reference that in an if statement enclosing the “rogue” method’s content.
I use a bool set to true for it, but i guess you can use anything you want since its just a variable that has to exist.There’s something dodgy going on in the midi-input. Whenever i try to dump midi-data to the console i get empty strings, and when i try to print out a single byte i get a value of 0 instead of an empty response (or the value it should have).
Weird thing is that i do not get “nil” errors anywhere also…Looks like the trouble i run into on the win build aswell, it seems as if something is blocking the midi processing…
No crashes on win though (yet).Posted some example code here:
ps: Looks like i’m not the only one fighting WordPress tags, takes me an average of 5 edits to make the code tags do their job, and i just gave up on the http-linking after some more fruitless tries :-/
*edit*
And, of course, when i finally give up and paste it as plain text: behold a working link….ps: the lsb() and msb() functions in the string.format of the last function in the list are helper functions that – you’ll never guess – calculate the lsb and msb for the given value.
function lsb(x) if x ~= nil then local bi = CtrlrLuaBigInteger(x) local lsb = bi:getBitRangeAsInt (0,7) return (lsb) end end
function msb(x) if x ~= nil then local bi = CtrlrLuaBigInteger(x) local msb = bi:getBitRangeAsInt (7,7) return (msb) end end
Sure, here’s a snippet of the function logic.
First an example of how i assign incoming midi to the modulators:
1 – Grab some values in midiReceived script and trigger appropriate functions when needed, passing on those variables:
midiReceived = function(midi) devID = 1 --make panel:getModulatorByName("midiDeviceId"):getValue() in initscript if midi:getSize() ~= nil then l = midi:getSize() end msg = midi:getData():getRange(0,l) eof = midi:getLuaData():getByte(5) cmd = midi:getLuaData():getByte(6) ID = midi:getLuaData():getByte(7) LS = midi:getLuaData():getByte(9) MS = midi:getLuaData():getByte(10) if dumpdatamsg:toHexString(1) == singleParamMsg then --its a single param value (singleParamMsg specified @ initscript) if ID == 1 then setCord00source(LS,MS) end if ID == 2 then setCord00dest(LS,MS) end if ID == 3 then setCord00amt(LS,MS) end
2 – Then the called functions do the assigning of values to the modulators so the panel reflects the device's state. The next example is one of this kind of functions.
function setCord00dest(x,y) --used to translate the cord source values into sequential numbers for the comboboxes --x is lsb, y is msb. MSB selects activated block --console(string.format("setCord00dest received lsb %.d and msb %.d",x,y)) if y == 0 then if x == 8 then x = 1 elseif x == 47 then x = 2 elseif x == 48 then x = 3 elseif x == 49 then x = 4 elseif x == 50 then x = 5 elseif x == 51 then x = 6 elseif x == 52 then x = 7 elseif x == 53 then x = 8 elseif x == 54 then x = 9 elseif x == 56 then x = 10 elseif x == 57 then x = 11 elseif x == 64 then x = 12 elseif x == 65 then x = 13 elseif x == 66 then x = 14 elseif x == 72 then x = 15 elseif x == 73 then x = 16 elseif x == 74 then x = 17 elseif x == 75 then x = 18 elseif x == 80 then x = 19 elseif x == 81 then x = 20 elseif x == 82 then x = 21 elseif x == 83 then x = 22 elseif x == 86 then x = 23 elseif x == 88 then x = 24 elseif x == 89 then x = 25 elseif x == 90 then x = 26 elseif x == 91 then x = 27 elseif x == 94 then x = 28 elseif x == 96 then x = 29 elseif x == 97 then x = 30 elseif x == 104 then x = 31 elseif x == 105 then x = 32 elseif x == 106 then x = 33 elseif x == 108 then x = 34 end end if y == 1 then if x == 33 then x = 35 elseif x == 34 then x = 36 elseif x == 35 then x = 37 elseif x == 36 then x = 38 elseif x == 37 then x = 39 elseif x == 38 then x = 40 elseif x == 39 then x = 41 elseif x == 40 then x = 42 elseif x == 41 then x = 43 elseif x == 42 then x = 44 elseif x == 43 then x = 45 elseif x == 44 then x = 46 elseif x == 45 then x = 47 elseif x == 46 then x = 48 elseif x == 47 then x = 49 elseif x == 48 then x = 50 elseif x == 49 then x = 51 elseif x == 50 then x = 52 elseif x == 51 then x = 53 elseif x == 52 then x = 54 elseif x == 53 then x = 55 elseif x == 54 then x = 56 elseif x == 55 then x = 57 elseif x == 56 then x = 58 elseif x == 57 then x = 59 end end cord00dest:setModulatorValue(x,false,false,false) end
Then the other way around, modulators sending out midi:
1 – Determine value to send for a certain modulator & pass the values on to the function that formats & sends out the midimessage.
cord00source = function(mod, value) if loaded == true then --"loaded" bool comes from initscript if value == 2 then --Key+=5 value = 5 elseif value == 3 then --Key~=9 value = 9 elseif value == 4 then --Vel+=10 value = 10 elseif value == 5 then --Vel~=11 value = 11 elseif value == 6 then --Vel<=12 value = 12 elseif value == 7 then --RlsVel=13 value = 13 elseif value == 8 then --Gate=14 value = 14 elseif value == 9 then --PitchWhl=15 value = 15 elseif value == 10 then --ModWhl=17 value = 17 elseif value == 11 then --Press=18 value = 18 elseif value == 12 then --Pedal=19 value = 19 elseif value == 13 then value = 20 elseif value == 14 then --MidiB=21 value = 21 elseif value == 15 then --FtSw1=22 value = 22 elseif value == 16 then--FtSw2=23 value = 23 elseif value == 17 then --Ft1FF=24 value = 24 elseif value == 18 then --Ft2FF=25 value = 25 elseif value == 19 then --MidiVl=26 value = 26 elseif value == 20 then --MidiPn=27 value = 27 elseif value == 21 then --MidiC=28 value = 28 elseif value == 22 then --MidiD=33 value = 33 elseif value == 23 then --MidiE=34 value = 34 elseif value == 24 then --MidiF=35 value = 35 elseif value == 25 then --MidiG=36 value = 36 elseif value == 26 then --MidiH=37 value = 37 elseif value == 27 then --Thumb=38 value = 38 elseif value == 28 then --ThmFF=39 value = 39 elseif value == 29 then --KeyGld=40 value = 40 elseif value == 30 then --VEnv+=60 value = 60 elseif value == 31 then --VEnv~=73 value = 73 elseif value == 32 then --VEnv<=74 value = 74 elseif value == 33 then --FEnv+=80 value = 80 elseif value == 34 then--FEnv~=81 value = 81 elseif value == 35 then--FEnv<=82 value = 82 elseif value == 36 then--AEnv+=83 value = 83 elseif value == 37 then--AEnv~=89 value = 89 elseif value == 38 then--AEnv<=90 value = 90 elseif value == 39 then--Lfo1~=91 value = 91 elseif value == 40 then--Lfo1+=97 value = 97 elseif value == 41 then--White=98 value = 98 elseif value == 42 then--Pink=99 value = 99 elseif value == 43 then--kRand1=100 value = 100 elseif value == 44 then--kRand2=101 value = 101 elseif value == 45 then--Lfo2~=102 value = 102 elseif value == 46 then--Lfo2+=105 value = 105 elseif value == 47 then--Lag0in=106 value = 106 elseif value == 48 then--Lag0=107 value = 107 elseif value == 49 then--Lag1in=108 value = 108 elseif value == 50 then--Lag1=109 value = 109 elseif value == 51 then--CkDwhl=110 value = 110 elseif value == 52 then--CkWhl=145 value = 145 elseif value == 53 then--CkHalf=146 value = 146 elseif value == 54 then--CkQtr=147 value = 147 elseif value == 55 then--Ck8th=148 value = 148 elseif value == 56 then--Ck16th=149 value = 149 elseif value == 57 then--DC=150 value = 150 elseif value == 58 then--Sum=161 value = 161 elseif value == 59 then--Switch=162 value = 162 elseif value == 60 then--Abs=163 value = 163 elseif value == 61 then--Diode=164 value = 164 elseif value == 62 then--FlipFlop=165 value = 165 elseif value == 63 then --Quantize=166 value = 166 elseif value == 64 then--Gainx4=167 value = 167 end paramChangeMsg(1,1,value) end end
2- Function that receives the data needed for the midimessage, formats it into a hexstring & sends it out.
function paramChangeMsg(paramNumLsb,paramNumMsb, paramVal) -- 5 values are: devID @ byte 3, paramnum @ 7 & 8, paramVal @ 9 & 10 if loaded == true then msg = string.format("f0 18 21 %.2x 55 01 02 %.2x %.2x %.2x %.2x 7f f7", devID, paramNumLsb, paramNumMsb, lsb(paramVal), msb(paramVal)) panel:sendMidiMessageNow(CtrlrMidiMessage(msg)) end --console(string.format(msg)) end
All this works without a hitch in Ctrlr 1417…
I will do some console dumping to see where stuff might get messed up if i have more time.- This reply was modified 10 years, 10 months ago by Hecticcc. Reason: these bloody wp tags keep messing with me
- This reply was modified 10 years, 10 months ago by Hecticcc.
- This reply was modified 10 years, 10 months ago by Hecticcc.
- This reply was modified 10 years, 10 months ago by Hecticcc.
- This reply was modified 10 years, 10 months ago by Hecticcc.
I use tables alot , been using loops to fill tables with data coming from memoryblocks for specific dumps/functions until now, this new call will make things less cluttered in some places 🙂
- This reply was modified 10 years, 10 months ago by Hecticcc.
It’s a letter l inthere, the variable from the first line. It’s how i grab entire messages 😉
Thanks for the info!
I wondered because as i am learning to code bit by bit i am starting to wonder about stuff like this as i learn more & more; but about some things (like this) i am still nearly clueless.I understand your doubts about it, it is a nice touch but not essential for Ctrlr. But i still vote yes 🙂
Come to think of it, it may become something very cool in Ctrlr if you could re-implement the panel db link inside Ctrlr & make the result of the id scan point you towards the correct panel. It would win over alot of non-tech savvy users i think.
Just thinking out loud though..
Cool!
I do this small-scale in the Emu-panel to detect the model of the sampler.But to make this kind of “global” db alone will be lots of work, or are you going to do some “public” db setup where people can add devices?
Hi Atom, would you mind showing how to draw the waveshape in the component using data from a MemoryBlock instead of a file? I’ve been trying to but can’t seem to figure out what to do instead of the loadFromFile call you use in the demo panel.
This new component is awesome, it will make a nice addition for being able to shuffle short samples into samplers using smidi, and turn my Emu sampler into a ppg on crack 🙂
Glad you’re liking it 🙂
Some news:
I’m making a “moar better” coded panel for this beast of a sampler, the version available now works but is not written very well knowing what i know now.
The rewrite is coming along nicely, almost cracked the preset dump format – the tech guys @ Emu back then really made it */!”#*# bonkers to interpret & parse but i’m getting there bit by bit.
I am also re-working the interface so it gets cleaner & more intuitive.
Will keep y’all updated, in the mean while – have fun with your favourite sampler!
Yup, just use some variable as means of control.
I put a variable in the init script and reference that @ the beginning of each script that can fire something off. Can be anything; for axemple i do this in the luaPanelLoaded script:
`loaded = 1`
And then in any script that can trigger something (timers/midimessages…) i do
`if loaded == 1 then
— your script here
end`This way the startup triggering will be muted until the panel is fully loaded, and once it’s loaded no more stuff gets “triggered” by the loading process (normally).
Thanks for looking into it Atom, i’m glad i figured out the how/why by myself also; seems i’m slowly getting the hang of it 🙂
Made a quick example of what i mean. Look @ what the console says when you adjust modulator one and modulator 2.
Thinking about it makes sense though;
-Using the expressions did not work because there is no midi being processed, only internal Lua data being thrown around so the substraction never happens.
-The script attached to the “asking” modulator fetches the value of the “originator” modulator, sees its current value and takes that in unaltered (of course)
So the only way to bridge the offset of 1 is to do it @ runtime, as far as i can tell. Or maybe is there some other way to implement this offset?
Attachments:
You must be logged in to view attached files. -
AuthorPosts