Calling all Coders!

solo-act

Fractal Fanatic
Do you recognize this language? Several forum members are looking to continue development of the Lemur iPad editor and we need interested coders. Below are a few random samples from the last template the developer released before he vanished with zero communication.

You can view more code by downloading these:
The Lemur editor, included in the download links:
https://liine.net/en/support/lemur

The template for the Lemur Axe-Fx editor:
https://dl.dropbox.com/u/54889552/AxeForLemur.3.06.zip

Launch the editor, open the template and click on the objects in the folders to see more scripts.

Lemur V4 for iPad still works. Lemur V5 changed a communication protocol somewhere.
As you'll see, the bulk of the work has already been done. It just needs to be tweaked to add the latest axe-fx features and make it compatible with Lemur V5. I have several ideas for further development, and several forum members have expressed interest in paying for an updated template, not to mention we'd be doing great good for the axe-fx community.

Any interest, thoughts and insights that contribute to re-starting development are highly welcome, and thanks for the consideration.


SAMPLE 1:

decl b, p, a, mb, mp, j, mbps;
cV.bpobj = getfirst(cMain);
for(;;){
mbps = getexpression(cV.bpobj, 'bps'); // new way uses less memory
if(sizeof(mbps)>=6){
b = {mbps[0], mbps[1]};
p = {mbps[2], mbps[3]};
if(b[hw]>99 && b[hw]<200){
if(cV.bypStates[b[hw]-100]>0){ // query blocks that exist in preset
a = 0;
if(cV.BlocksToRefresh[0] == 0)
a = 1; // query all
else
for(j=0;j<sizeof(cV.BlocksToRefresh);j++){
if(b==cV.BlocksToRefresh[j]) a=1; // query blocks listed in BlocksToRefresh
}
if(a == 1){ // add block and param num to list
cS.addRefreshParam(b[hw],p[hw]);
++cV.numcontrols;
}
}
cV.bpobj=getnext(cV.bpobj); // check all objects in the container
if(cV.bpobj==0)break;
if(cV.numcontrols==750) break; // prevent buffer overflow
continue;
}
}


mb = getexpression(cV.bpobj, 'bids'); // multislider support
if(hw==0)
mp = getexpression(cV.bpobj, 'pids');
else mp = getexpression(cV.bpobj, 'pids2');
if((sizeof(mb)>1) && (sizeof(mp)>1)){ // finds containers with pids and bids expressions
if(mb[hw]>99 && mb[hw]<200){ // sanity check block num
a = 0;
if(cV.BlocksToRefresh[0] == 0)
a = 1; // query all
else
for(j=0;j<sizeof(cV.BlocksToRefresh);j++){
if(mb==cV.BlocksToRefresh[j]) a=1;
}


if(a==1){
for(j=0;j<sizeof(mp);j++){ // the number of elements in pids
if(cV.bypStates[mb[hw]-100]>0){ // query blocks that exist in preset
cS.addRefreshParam(mb[hw],mp[j]);
++cV.numcontrols;
if(cV.numcontrols==750) break; // prevent buffer overflow
}
}
}
}
}
cV.bpobj=getnext(cV.bpobj); // check all objects in the container
if(cV.bpobj==0)break;
if(cV.numcontrols==750) break; // prevent buffer overflow
}


// **********************************


SAMPLE 2

// p1 is source block on the grid (0 to 47)
// p2 is destination block on the grid (0 to 47)
// flag is 0 to disconnect, 1 to connect
//send Axe-FX II Connect Effect message
decl mess, outmess, checksum;
if(!hw){
mess = {
0xF0,0,1,0x74,3,6,
floor(clamp(p1,0,47)),
floor(clamp(p2,0,47)),
floor(f)
};
checksum = cS.calcchecksum(mess);
outmess = {mess, {checksum, 0xF7}};
}
else {
// axefx ultra and std Connect Effect message
outmess = {
0xF0,0,1,0x74,aUser.cMidi.hwids[tidx],6,
floor(clamp(p1,0,47)),
floor(clamp(p2,0,47)),
floor(f),
0xF7
};
}


midiout(aUser.cMidi.targets[tidx], outmess);
// **********************************

SAMPLE 3// b is block number; 200 = place shunt; 0 = clear block
// pos is location on the grid (0 to 47)
// flag is 0 to clear block, 1 to place block
//send Axe-FX II Place Effect Block
decl mess, outmess, checksum;
if(!hw){
mess = {
0xF0,0,1,0x74,3,5,
floor(b) & 0x7F,
(floor(b) >> 7) & 0x7F,
floor(clamp(pos,0,47)),
floor(flag)
};
checksum = cS.calcchecksum(mess);
outmess = {mess, {checksum, 0xF7}};
}
else {
// axefx ultra and std Place Effect Block
outmess = {
0xF0,0,1,0x74,aUser.cMidi.hwids[tidx],5,
b & 0xF,
(b >> 4) & 0xF,
floor(clamp(pos,0,47)),
floor(flag),
0xF7
};
}


midiout(aUser.cMidi.targets[tidx], outmess);
// **********************************
 
Took a quick glance at the Lemur user guide and pretty sure this is the Lemur scripting language. On page 145 "Parser Quick Reference" they have functions such as clamp() etc. Someone familiar with C/C++ would be who you are looking for since the scripting language is similar to C.
 
Looks like objective C for IOS to me. The lines that begin with // are remarks, so you have some comments there as to what the blocks of code are doing. I'm just starting to learn this stuff, so I'd love to participate at some level.

Sent using Tapatalk 4.
 
Obviously that's not all the code (well i hope)

The language looks fairly straight forward

might be a good start to put the code on Github or sourceforge (open source platforms)

Question how did you get the code, what happened to the original developer?
 
Note i have the will and the skeels, however my time is the problem

If you find some unemployed bum coder who has the time and the know-how to act as point on the project then get it up on an open source platform ill be more the happy to contribute
 
Since it's an iApp it's likely to be Objective C. These samples don't have any of Objective's more esoteric weirdness though so I can't be positive.

The absence of any pointers, references or other fun stuff seems a bit odd. Some sort of scripting language?

might be a good start to put the code on Github or sourceforge

Second this. If you want people to work on it you'll need to put it up someplace accessible. Then the language should be obvious.
 
Okay, purchased Lemur and installed everything to take a glance to see if was just something quick to at least get working as looked cool. After unsuccessfully trying to see how Lemur was suppose to work changed gears and found a tutorial on using Lemur with ableton... Holy crap, Lemur is awesome and that was painfully easy to map to that. Back to AxeFX however... as a quick test created a dummy control and axefx midi in lit up... awesome... it's not a communications issue, but bad news was not sending useful midi data to it either. Digging further as starting to learn the editor found a boat load of invalid functions so appears v5 radically altered some things when it comes to the scripting language and/or UI objects. Unfortunately starting to look like a significant effort to bring back to life but will take another glance next week... it's possible the large number of invalids are due to references to other invalids.
 
Solo-Act, since you still have V4 can you post or PM me a screenshot of the following in the Lemur PC or Mac editor:
Project->AxeForLemur

I'm curious to see if dlgAsciiKbd appears in the listing from v4, I expect should be somewhere after following in the list: cMain, cS, cScanX, cShow, cV... It appears that for Lemur v5 this template exceeds the memory limits imposed the editor and just quits populating objects/scripts. The load shows 100% when you open the template... if you try to create additional scripts or objects it does nothing... if you delete a few items then editor performs as expected.

So if anyone knows where to get the Lemur v4 editor for PC I can download and confirm myself as well. Sorry it's not looking promising, to move the code forward appears someone with v4 would need to remove some functionality to make it small enough to open in v5 as it appears critical scripts/functions are missing which is why so many invalid objects.

Edit: another idea, someone with v4 could spilt into multiple lemur templates... Not the all in one but better than loosing stuff...

Jason
 
Last edited:
Looks like objective C for IOS to me. The lines that begin with // are remarks, so you have some comments there as to what the blocks of code are doing. I'm just starting to learn this stuff, so I'd love to participate at some level.

Sent using Tapatalk 4.

I thought C++ or script since there are no square brackets on function/method calls?

I think since the "new paradigm", the interaction with the AxeFx is essentially undocumented and not really supported for 3rd party efforts such as this.
 
I think since the "new paradigm", the interaction with the AxeFx is essentially undocumented and not really supported for 3rd party efforts such as this.

I recall FAS saying that if you were a legit developer, they would work with you. They just weren't going to publicly publish the new spec.
 
I recall FAS saying that if you were a legit developer, they would work with you. They just weren't going to publicly publish the new spec.

I sent out some feelers a while back. I wasn't shot down, but I got the impression the AE protocol was not formally published.

Doesn't hurt to ask again though :)
 
It's Lemur script which is very C/C++ like

It's just midi and there will always be hackers with too much time ;) I really wish had tried the template back on V4, this thing appears really awesome. I always avoided because Lemur was $50 at the time, was still learning the front panel, and didn't have time to tinker with yet another software package. Anyhow, Axe-Edit is here now and rocks so guess that leaves this is a niche group.
 
Okay here is the scoop... the code is there and can see it in the template file, just can't access in gui under V5 and not going to manually try to manipulate the template file...

If someone has the Lemur v4 editor installer for PC (not Mac) send it over to me since I can't do this in v5 and like all IOS related stuff only the latest version is available. I'll try posting on their forum over the weekend if don't hear from anyone before then.

Otherwise since you have V4 installed please export all the top level objects under AxeForLemur. Call them exactly as they are named like: aUser, cbHideRoutes, cbProgName, etc. going down the entire list. zip these up and post them somewhere for me to grab. I can import them one at a time to v5 and this way can selectively remove some of the functionality or split the template but believe pretty easy to get going with this approach.

View attachment 20742
 
Solo-Act, since you still have V4 can you post or PM me a screenshot of the following in the Lemur PC or Mac editor:
Project->AxeForLemur>>dlgAsciiKbd
Here you go:
13449055723_e3c2752788_b.jpg

It appears that for Lemur v5 this template exceeds the memory limits imposed the editor and just quits populating objects/scripts. The load shows 100% when you open the template... if you try to create additional scripts or objects it does nothing... if you delete a few items then editor performs as expected.
The dev had to work around memory limit but he managed to squeeze in a routing interface and patch name/save. This created a stand-alone editor for creating/editing patches. The innovation is you can access more amp parameters and edit two blocks at once. Combined with touchscreen, it's the fastest way to tweak patches, especially for users with a lot of presets.

So if anyone knows where to get the Lemur v4 editor for PC I can download and confirm myself as well.
I stripped back the URL and typed in 4.1.exe and it downloads the V4.1 installer for the editor. It says "not found" but in about 30 seconds it downloads.
https://liine.net/assets/files/lemur/Lemur-Installer-4.1.exe
If it doesn't work I can email to you.

Sorry it's not looking promising, to move the code forward appears someone with v4 would need to remove some functionality to make it small enough to open in v5 as it appears critical scripts/functions are missing which is why so many invalid objects.

Edit: another idea, someone with v4 could spilt into multiple lemur templates... Not the all in one but better than loosing stuff...

Jason
Yes this can easily be done and was one of my ideas for development.
IMO, the editor started becoming more than just a preset creator/editor and that takes up memory. For example, this synth video shows how awesome the developer was, but it's so specialized I'd never use it.

That said, it's a perfect candidate for a synth-focused template for someone who wants it. And dare I say…I've never seen Axe Edit do this!
 
If someone has the Lemur v4 editor installer for PC (not Mac) send it over to me
Here's the link again. Wait about 30 seconds and it should download. I can email as well. https://liine.net/assets/files/lemur/Lemur-Installer-4.1.exe

Otherwise since you have V4 installed please export all the top level objects under AxeForLemur. Call them exactly as they are named like: aUser, cbHideRoutes, cbProgName, etc. going down the entire list. zip these up and post them somewhere for me to grab. I can import them one at a time to v5 and this way can selectively remove some of the functionality or split the template but believe pretty easy to get going with this approach.

View attachment 20742

I'll try to export and put them up somewhere.

I think out of the gate you can delete these two folders:
ExtControl
Tuner
They're extra features that don't effect creating/editing/saving a preset.

If that isn't enough, the looper and the synth are so rarely used in patch editing maybe they can be temporarily sacrificed to get the editor up and running.
 
I really wish had tried the template back on V4, this thing appears really awesome. I always avoided because Lemur was $50 at the time, was still learning the front panel, and didn't have time to tinker with yet another software package. Anyhow, Axe-Edit is here now and rocks so guess that leaves this is a niche group.
It really is awesome. Best $50 I ever spent. I manage about 40 unique patches.

When big firmware updates come, players who gig for a living typically have many patches and little time between gigs to redial all of them. Same goes for players with day jobs and families.
Dialing time is why a lot of people hold off on firmware updates.
The big boys are even farther behind on updates.

In fact, the most common Axe-Fx complaint is time spent dialing vs. playing.

The Lemur editor is a great solution.

It's just that people either haven't tried it or they're not iPad users. Everyone I've seen who manages lots of patches, has an iPad, and checks this out is usually hooked. It's a great tool.
 
Many thanks for grabbing that stuff! Pulled down 4.1 and installed it, stripped out the synth stuff and that reduced to 94% in v4... then loaded in v5 and was at 99% so potentially still a little high for comfort but will see. Just on a quick pass basterdizing the code was able to get the basics talking... changing patch, flipping to a new amp or cab block, bypass and x/y states.... too many things to count that were not working as well but for a hack-and-go it confirmed the memory limit issue.
 
The answer, hint, I got via maill from Linne support:

"I had a look at the template. Indeed, it's an issue with dot notation. Since Lemur 5.0, dots can only be used after an object name (not after variables). We are introducing a new function in 5.0.2 called findchild() that lets you find objects in Containers using variables too. The template is very, very big and it's unfortunately beyond the resources of Liine Support to do it for you. Perhaps best approach would be to find other users on the Liine Forum and collaborate on this."

My understanding is that from 5.0.2 it will be easier to find those lines with "dot notation". Anyway the template can be easely viewed if just renamed to .txt - if anyone is interested to work on this.
 
Nice find prot! Needed a quick google search to see what that means but understand now. Certainly 5.0.2 findchild() seems better than rewriting with findobject()/getexpression(). Noticed Lemur 5.0.2 also increases the memory limit from 32mb to 48mb, best to wait for that release to avoid stripping functionality from template.
 
Back
Top Bottom