Forum Replies Created
-
AuthorPosts
-
Jase,
I’m looking at doing a similar, but much more complicated running status method.
My approach is going to be to save the last message sent, and if the current one is the same message “type”, just send the changing status bytes.
You could do a similar thing with your panel. Basically for all the NRPN knobs, save the last message sent as a variable, or possibly last ctrlr slider moved. onValueChange for the controller, have a little logic test. If the current control is the same as the last, just send the data message, otherwise send the NRPN headers.
To send a message from LUA, this code will help (thanks to DasFaker)
m = CtrlrMidiMessage({0xb0, 0x6e, 0x02}) panel:sendMidiMessageNow(m) m = CtrlrMidiMessage({0xb0, 0x6f, panel:getModulatorByName("AEnvA1TLayer":getValue()}) panel:sendMidiMessageNow(m)
With NRPN’s I think you need to send messages to indicate that you’ve finished with the NRPN (so inadvertent data slider messages don’t change stuff you aren’t planning to), so you may need to incorporate this into sending the NRPN headers.
- This reply was modified 8 years, 10 months ago by Puppeteer.
The Puppeteer
http://godlike.com.auThat works fine. Thanks so much.
Will probably have a bunch of questions on MIDI inputs soon…
BTW – how the heck do you work this stuff out? ie how did you find out the getMidiMessage(0) part?
I’m relying on checking other panels and doing forum searches and a bunch of trial and error…
The Puppeteer
http://godlike.com.auOK, thanks, that makes sense. I’ll give it a go.
The Puppeteer
http://godlike.com.auThe ctrlr version on my tablet is an old version (Rev 1655). Saved an uploaded as requested
Attachments:
You must be logged in to view attached files.The Puppeteer
http://godlike.com.auOpens OK here in Win 8.1 64bit.
The Puppeteer
http://godlike.com.auIn the VST instance, this can often be assigned within the DAW Host, such as Ableton, and is how I’m assuming it will be handled in the panel I’m developing, but yes it would be nice to have that functionality in the standalone, as long as it doesn’t clash with the DAW host control.
The Puppeteer
http://godlike.com.auThere’s a JD panel available here, though as it’s deprecated, not sure how it will work.
The Puppeteer
http://godlike.com.auJust on this, I think it’s actually a limitation of most PC MIDI drivers, rather than a ctrlr issue.
The Puppeteer
http://godlike.com.auI don’t have the hardware or run the panel in question, but normally the panel is designed to interface with a particular synth so if you move a knob on the screen it will send out the appropriate MIDI to change that value on the synth.
If you want to control the panel faders from a controller device, then either a) the panel creator has to code for it specifically (which is unlikely due to the ease of option b) or you b) use a VST host to assign the controller to the VST knobs.
The Puppeteer
http://godlike.com.auI’ve found the same thing with the PC3 editor I’m building. It doesn’t seem to be multiclient. I thought it was the PC3’s MIDI interface, but it might be Ctrlr
In ableton, it’s pretty easy to work around, just turn the MIDI device off in Ableton and set it with the Ctrlr VST. You can then reroute Ableton tracks to send to the track with the Ctrlr device on it, and it works as normal.
Another option might be one of the virtual MIDI drivers (like MIDI Yoke or CopperLan), where you can use the virtual MIDI cable as a sort of sacrificial MIDI port and just forward it to your normal MIDI interface.
The Puppeteer
http://godlike.com.auI haven’t had much luck with the global variables in the right pane.
Any variable declared in LUA appears to be global to the panel anyway, so I’m just using them and building the messages in LUA.
The Puppeteer
http://godlike.com.auHi AHCS,
From what I read in the manual, the pitch and filter mod are the only 2 parameters that can be controlled in real time. Probably volume and pan as well.
From what I can tell (and I don’t have a poly 800 to test it with) all of the sysex stuff if for dumps.
Conceivably you could build a panel to allow offline editing and then dump the patch to the Poly 800, but I don’t think it will allow real time control, based on what I read in the manual.
Unfortunately I don’t have the time to work on a panel with you, and not having a Poly 800 to develop with will make it difficult. I’m currently immersed in my Kurzweil PC3 editor panels, which will be an enourmous job given that a) no SYSEX or control spec has been released, meaning I need to completely reverse engineer it myself from trial and error, and b) there are probably more than 10,000 parameters that can be controlled.
Am happy to answer questions if I am able, on the forum though and give what support I can, for you to do it.
I’m still very new at this, but the Poly 800 should be an achievable panel for a beginner, with a bit of work.
I’d suggest the following steps.
1) work out how to manually dump from the Poly 800 to something like SendSX (http://www.bome.com/products/sendsx)
2) Isolate a patch from the dumps for testing
3) Work out how to send that patch manually from Ctrlr using a button and the SYSEX box in the right pane.
4) Work out how to send the patch manually using LUA (panel:sendMidiMessageNow(m) will be useful where m is your SYSEX String) and how to trigger that from a panel control.
5) Work out how to assign knobs and sliders to variables and to substitute them into the sysex string prior to sending it for a single control
6) Repeat step 5 for all other controls
7) Make it look pretty.
The Puppeteer
http://godlike.com.auNo worries.
The easiest way is to create a new panel.
Right click on the panel and add a uiSlider.
With the uiSlider (modulator-1) selected (should have an orange box around it), scroll down in the right pane until you get to the MIDI section.
Set midiMessageType to CC
set midiMessageCtrlrNumber to 2 (for filter cutoff, or 1 for pitch).Up the top, select the Panel menu and select Panel Mode
In the MIDI menu select your MIDI output and set it to channel 1.Now you should be able to play a note and use the mouse to move the new knob and it should change your filter cutoff.
I thought about the range today, and it actually ranges from 0 to 78 (hex) or 120 (decimal), but it will only have 16 steps over the range. It’s essentially a full knob range anyway.
The Puppeteer
http://godlike.com.auThere’s a few of us in the same boat, so keep the discussions going here and hopefully we can build our knowledge quickly.
The Puppeteer
http://godlike.com.auFrom the manual, it looks like real time control is very limited (pitch, filter cutoff)
The messages for pitch are Bch 01 nn (where ch is the midi channel and n is in the range of 8 – 78 and is the Most significant byte (MSB). It has 4 bit resolution (so 16 values)
The messages for filter cutoff are Bch 02 nn. same format as above.
SYSEX can be used for editing patches off line and transmitting to the synth. The SYSEX dump format is actually pretty well detailed.
The Puppeteer
http://godlike.com.auNot familiar with the Matrix, but a couple of things to check on Ctrlr.
Have you set a MIDI output from the MIDI menu at the top.
Have you checked that MIDI is being transmitted using the MIDI Monitor?
The Puppeteer
http://godlike.com.auNever mind, I worked it out.
There’s probably a much better way of doing this, but this works
-- get the MIDI Channel from the panel and set ch to the hex representation of that -- ready for transmitting as part of the MIDI message. -- Will need to move this either to InitializePanel and/or to a method when MIDI Channel changes ch = string.format("%x",L(panel:getPropertyString("panelMidiOutputChannelDevice"))) -- for debugging -- console (ch) if ch == "1" then Mch = 0xb0 elseif ch == "2" then Mch = 0xb1 elseif ch == "3" then Mch = 0xb2 elseif ch == "4" then Mch = 0xb3 elseif ch == "5" then Mch = 0xb4 elseif ch == "6" then Mch = 0xb5 elseif ch == "7" then Mch = 0xb6 elseif ch == "8" then Mch = 0xb7 elseif ch == "9" then Mch = 0xb8 elseif ch == "a" then Mch = 0xb9 elseif ch == "b" then Mch = 0xba elseif ch == "c" then Mch = 0xbb elseif ch == "d" then Mch = 0xbc elseif ch == "e" then Mch = 0xbd elseif ch == "f" then Mch = 0xbe else Mch = 0xbf end -- if
-- Controller 1 Program m = CtrlrMidiMessage({Mch, 0x6e, 0x02}) panel:sendMidiMessageNow(m) -- Controller 2 Layer. Get the layer from the AEnv1TLayer control m = CtrlrMidiMessage({Mch, 0x6f, panel:getModulatorByName("AEnvA1TLayer"):getValue()}) panel:sendMidiMessageNow(m)
The Puppeteer
http://godlike.com.auJust one more question on this,
How would you make the midi channel dynamic (ie set 0xbn) where n is the MIDI channel of the host or panel
The Puppeteer
http://godlike.com.auHi Dasfaker,
Thanks so much for your help. I got it working, now the hard work begins to start populating it all.
I’m sure I’ll have more questions as I get my head around everything.
Just one minor change for anyone coming along afterwards
One of the lines above is missing a “)”
m = CtrlrMidiMessage({0xb0, 0x6f, panel:getModulatorByName(“AEnvA1TLayer”:getValue()})
should be
m = CtrlrMidiMessage({0xb0, 0x6f, panel:getModulatorByName(“AEnvA1TLayer”):getValue()})
The Puppeteer
http://godlike.com.au -
AuthorPosts