Forum Replies Created
-
AuthorPosts
-
I never finished it. I build the single dump functionality (so I can dump and display a single dump). I got some code from someone else and have been speaking with Kurzweil R&D and have a fairly complete understanding of the file and dump structure now, so it’s become a bit redundant for me.
I will continue to develop it a bit, as I need to test the packing and unpacking required for the Kurzweil dumps, but that won’t be for a while. Basically I’m using this panel as a test bed for pulling data from dumps now (ie check which byte represents the LFO shape, for example)
I’ve moved on to developing the actual functional panels, and I’m just working with the header data at this stage (unpacked data), so don’t need it. For my next panel for Kurzweil synths, I will need this, so might look at it again then.
I’ll have a look through my code to make sure there’s nothing confidential in there that I can’t share, and if it’s clear, I’ll publish what I’ve done. I’m under NDA with Kurzweil so need to be very careful about what I share.
The problem with HxD and similar, is that I need to unpack some of the data first, so I can see changes in the dumps, but parameters are spread across bytes after packing. I need to be able to operate on the unpacked data.
- This reply was modified 7 years, 9 months ago by Puppeteer.
The Puppeteer
http://godlike.com.auGoodweather, I’d be very interested in that code. PM me or email if you wish.
I’m writing a panel for a Roland Jupiter 8 and the update method is by sending a sysex dump to the edit buffer (basically rewriting the whole edit buffer on value change). It works well, except the processor can’t handle MIDI too quickly, so I need to space the dumps out (ie collect all changes in x ms and update the synth edit buffer).
If I click individual values on a slider it works perfectly, if I click and move a slider things come to a grinding halt.
The Puppeteer
http://godlike.com.auYou need to change the uiSlider to an ImageSlider. There is a field for the graphic resource under ImageSlider, that populates from your resources.
Also, the images only support vertical orientation not horizontal, so make sure you export as vertical out of jKnobMan.
The Puppeteer
http://godlike.com.auI think you’ll need to do this through LUA. I think the simple SYSEX formulas in the modulator bar can only handle an MSB and LSB value only. Anything more complex will require LUA.
The Puppeteer
http://godlike.com.auYou might be able to use this if you use a fixed slider or a fixed image slider and map all your values.
Controller7 = panel:getModulatorByName(“EnvAA3T”):getValueMapped()
The Puppeteer
http://godlike.com.auMy application was using 2 x global variables in the same dump request, and not being able to effectively change them.
The Puppeteer
http://godlike.com.auI gave up on the global variables, and use LUA instead.
The Puppeteer
http://godlike.com.auNo reason why not, if it’s all driven through a single MIDI port.
The Puppeteer
http://godlike.com.auYou’ll need a script on the Called when panels receives a MIDI Message.
In the script you’ll need to check the incoming MIDI message for the message received, probably using a series of IF statements.
If the MIDI is what you want, set the Panel Object to the desired state, using a command similar to one of the ones below
panel:getModulatorByName(“Env3A1T”):setValueMapped(EnvTimeLookup(0),true,true)
panel:getModulatorByName(“Env3A1L”):setModulatorValue(100,false,true,true)The Puppeteer
http://godlike.com.auI update a label as well during the loop.
For a fancy screen that would probably solve your sysex issue, have a look at the miniak panel. It uses a layer over the top to disable the controls.
The Puppeteer
http://godlike.com.auJune 21, 2016 at 1:45 am in reply to: Is it possible to write something in a specific line in a uilistbox? #69461No, you can only replace the entire string.
Best way is create a table to hold each line. Update the relevant table entry.
When you need to update the list is content call a method that cycles through each table element concatenating with /N and then write the resulting string to the list is.
There’s an example in the miniak panel for the program list.
The Puppeteer
http://godlike.com.auThanks,
Looking at this and the MiniAk panel, I think I may need to convert it all to text, save that, and then deceipher the text to rebuild the table.
Was hoping to avoid that and keep the structure in place in the file.
The Puppeteer
http://godlike.com.auI’m working on the same panel as Kunka, and I’ve come up against a bit of a road block.
I have a large table of strings (previously declared and populated)
prgName[1]=”: Program 1″
prgName[2]=”: Program 2″
prgName[3]=”: Program 3″
prgName[4]=”: Program 4″
prgName[5]=”: Program 5″
…
prgName[4223]=”: ”This is used to populate a uiListBox and it works well.
What I want to do is save the prgName table to a file so I don’t have to do 4223 dumps every time I open the panel, but can instead just load it from disk, and update small sections of it by dumping single objects.
I’m trying to use the saveContentAsData method from the demo panel but get this error.
At line [-1]: [C]
Error message: std::exception: ‘unable to make cast’
I’m sure it’s because I’m trying to convert the table of strings to binary data with
mbList = MemoryBlock (prgName)
Anyone know how I can convert the table of strings into something I can save and later reload into the same table?
The Puppeteer
http://godlike.com.auI’ve used touch on windows with ctrlr vst’s and it’s pretty responsive right out of the box. I’m using a Samsung series 7 slate.
The Puppeteer
http://godlike.com.auI think you are definitely in LUA territory here.
There are 2 ways I would look at doing this. If the Wave Number L and Wave Number R parameters are quite short lists (ie 4 parameters each), you could look at using if statements to read the value of the Wave Number L know and if it’s a certain value either unhide a knob that has the relevant sysex programmed to it for the particular Wave Number L value, or a better way, especially for long lists of values is:
Use concatenate to combine 2 sysex strings. Ie Set Wave Number L and send it’s sysex string on ValueChange and set Wave Number R where it sends Wave Number L concatenated with the 4 additional bytes and concatenated with the string termination (F7) that Wave Number R reads, and use the SendMidiNow() command to send the sysex string.
Regarding receiving the sysex dump and setting the modulator values on the panel, you’ll need to program LUA in the OnMidiReceive (I think that’s what it’s called) event on the panel, and call a module. In the module, you’ll need code that checks the dump, and reads the various bytes and does things with them.
This is quite a tricky part and something I’m in the process of learning myself.
I’d recommend getting the panel to correctly send everything first as step 1. Once that’s all working, start looking at the receiving MIDI end.
The Puppeteer
http://godlike.com.auLast I checked it was 5.2. I think Atom was planning on integrating 5.3, but not sure if it’s been done yet or not.
Easy way to test is to see if the LUA bitwise operators are working or not. I had to use the old long hand functions to implement bitshifting, in my current panel.
The Puppeteer
http://godlike.com.auProbably the easiest way is to send a universal SYSEX ID request
0xF0 SysEx
0x7E Non-Realtime
0x7F The SysEx channel. Could be from 0x00 to 0x7F.
Here we set it to “disregard channel”.
0x06 Sub-ID — General Information
0x01 Sub-ID2 — Identity Request
0xF7 End of SysExRef: http://www.blitter.com/~russtopia/MIDI/~jglatt/tech/midispec/identity.htm
All synths (with sysex) should return a response to this that features the manufacturer ID and the Product ID. If the response matches the module you are expecting, then you know the inputs and outputs are set correctly.
edit: accidentally posted the PC3’s response to the universal request, instead of the request itself. Now fixed.
- This reply was modified 8 years ago by Puppeteer.
The Puppeteer
http://godlike.com.auThere’s a lot of additional info in the InDev document that can be found here – http://ctrlr.org/forums/topic/ctrlr-step-by-step-guide-in-dev-version/
I’ll hopefully be getting back into coding my next panel soon and will add more. I’ll also be trying to build a librarian, so I’m sure there’s going to be a lot built into the guide between Dominique and myself.
The Puppeteer
http://godlike.com.auI’m not sure what you are trying to achieve here.
Maybe some background on what Knob1 and Knob2 are controlling (ie Knob 1 sets oscillator, knob 2 controls PWM of that oscillator) or something similar.
If you are trying to incorporate a byte/s from the knob1 sysex message into knob2 sysex message, you’ll need to use LUA to store the byte/s from knob1 (onValueChange) and use LUA on knob2 to assemble the SYSEX message and send it.
The Puppeteer
http://godlike.com.auInstall the AU version of Ctrlr.
Open the Ctrlr AU in Ableton, load up the mks-80 panel
Save restricted instance and it will render down the AU of the panel.Load the new AU into Ableton.
The Puppeteer
http://godlike.com.au -
AuthorPosts