Fresh off the bat from the LXP-5 project, I moved onto building an editor for the Lexicon LXP-1. The nice thing about this project is that I have highly functional shell from the the LXP-5 project. I’m several weeks into the project by this stage and therefore will detail steps already taken.

LSP-1 with the physical save option during the testing phase
I started the project by building new algorithm diagrams to represent the LXP-1 algorithms. After importing in and setting up new layers, I then added a series of controls including dials and faders. I kept the shell of the LSP-5 so that I can easily build an LSP-15 plugin for the LXP-15. I have borrowed a version to and therefore will write to this spec.
Progress is good but without a remote, it is a pain so I have decided to get to know the Lexicon LXP-15 so that I can load in a LXP-1 or LXP-15 present and then use the LCD to see what values are contained in the parameter ranges. The LXP-15ii manual can be found here (link).
Selecting “Registr” allows the ADJUST knob to be used to scroll through the
LXP-15 II’s 128 registers. The next selection is “All”. Selecting “Send” will cause
the contents of the displayed register (or the contents of all registers) to be
transmitted. The last selection on the list is “MIDI Map Table”.
Lexicon LXP-15 ii manual, page 6-4
Nope. Not for me. For the LXP-15, my first challenge was to get the SysEX dump of all presets. That way, I can return the LXP as I found it which is the only fair thing to do. The SysEx received came in at F0 06 06 40 43 00 F7, not a full dump. Scratching my head, I had to dig deeper.
In the end, I decided to complete this one by one. Time consuming and a pain but thorough. I then moved onto looking at the figures from the preset and amazing, it contained values I am looking for for High Cut, Low Cut.
After looking through the presets, jackpot. I have all of the High Cut Frequencies, Low Cut Frequencies, Reverb Size values and much more. there are some discrepencies betwen the LXP-15 and LXP-5. Bass Multiplier, Reverb size from the LXP-5, MRC and LXP-15 manuals but this is due to variation and character of the boxes. I always thought they were the same but I can see, they are not but there is enough information to fill in the blanks and make my LXP-5 and LXP-1 editor very accurate. Much more accurate than the first revision.
Now, next jackpot. The LXP-15 manual contain most of the algorithm diagrams for the LXP-1! Woohoo. I can really turn this editor into something special but I still need to track down a small number.
After extensive search, I concluded that it may be a good idea to get in touch with Tonfisch. Tonfisch wrote the editor for the TC1128x and also wrote a very cool and very different type of Lexicon LXP-1 editor which follows a classic interface style, while mine maps hard to algorithms to save on my brain power. Plus, I gear my editor for my workflow. How I use a DAW, prefer automation and other features which I need for my hardware/software hybrid. My thoughts are different horses for different courses. The more of these editors out there, the more choice and the more we all win. Anyhow, that was quite a tangent. The short of it is that Tonfisch is a top person and kindly emailed over the algorithms and offered support! That is so nice and it is massively appreciated. I now have enough for my algorithms.
Anyhow, here tare the panel images for my editor:

Reverb 1: Note – Same but added reflection level from Tonsfisch’s Diagram

Plate Algorithm: 100% match with Tonfisch.

Gated Reverb: My diagram is quite different to Tonfisch’s. I’m sticking with mine for now but will review the LXP15ii manual again.

Inverse: 100% match with Tonfisch

Delay 1: Match from the manual. My diagram needs a little clean-up.

Delay 2: I created this one from Tonfisch’s block diagram. I couldn’t track this down. Due to space need from squishing this into the Ctrlr window, mine differs from Tonsfisch by pushing the right delay to the right.

Chorus 1: I created this one by refering to Tonfisch block data algorithm and adapted to fit into my Ctrlr panel. It’s another algorithm I struggles to track down.

Chorus 2: I created this one by refering to Tonfisch block data algorithm and adapted to fit into my Ctrlr panel. It’s another algorithm I struggles to track down.
Brilliant. So here they are. the LXP15ii manual contains an additional Chorus Delay data block (p3-13) which will be created when the LXP15ii section of the editor is built.
When looking at the data flows, you can see that there are a lot of differences between the LXP-15 and especially the LXP-1. Probably small in usage due to the shared LEXICHIP1 but it does mean they have their own character and I can see why people may chose to own all three.
Eventually, towards the end of the projects, the algorithm data flows were revised many, many times. To give you an idea of the type of development that goes into this, here is a chart to show you the types of precision and changes made as the project evolves. Only 8 of these diagrams were used in the final project.

Another LXP-1 quirk is that to enable two way communication (IN and OUT), you need to open the box and change a jumper. W3 to W2 allows MIDI to flow out. Considering how fantastic the midi is inside the LXP-1, I’m really surprised it is factory shipped with THRU as the default. Anyhow, enough waffling, a video of how I completed this on my LXP-1 can be found here (complete with parody thumbnail):
My next step is to continue working on the extreme ranges for the LXP-1 dials.
Contrary to my original plan where I decided to dial in the extreme values any extra from saved presets, I discovered that the 16 bit data values were already documented in the Reflex manual. through using an online HEX to decimal converter (link), it became pretty easy to find out the extreme values and translate into the main algorithm. Page 20 of the Reflex Midi Implementation manual.
Reverb Algorithm
Description | HEX | Decimal | Step Hex (Decimal) |
0Mid Reverb Decay | 8000-BC00 | 32768 – 48128 | 0400 (1024) |
Predelay | 8000-BFC0 | 32768 – 49088 | 0040 (64) |
Effects Level | 8000-BFC0 | 32768 – 49088 | 0040 (64) |
Bass Multiply | 4000-B800 | 16384 – 47104 | 0800 (2048) |
High Freq Cutoff | 8000-BC00 | 32768 – 48128 | 0400 (1024) |
Size | 8000-BF00 | 32768 – 48896 | 0100 (256) |
Predelay Feedback | 4000-BF80 | 16384 – 49024 | 0080 (128) |
Diffusion | 8000-BFC0 | 32768 – 49088 | 0040 (64) |
Reflection Level | 8000-BFC0 | 32768 – 49088 | – |
Reflection Decay | 8000-BFC0 | 32768 – 49088 | – |
Making good progress. Most of the values correspond correctly. There are a few anomolies for example, Bass Multiply has 32 steps but the range of 2048 per step only leads to 16 spaces. Adding 1024 gets to 32 steps but the last value does not sit properly by one space. 32 steps leave 48128. there question, is it 31 steps or is the value out by one? That’s the challenge with these old boxes. Reflex has -8 to +8 but can hold more inbetween. At least 0.3 to 2.5x is consistant.
16384,17408,18432,19456,20480,21504,22528,23552,24576,25600,26624,27648,28672,29696,30720,31744,32768,33792,34816,35840,36864,37888,38912,39936,40960,41984,43008,44032,45056,46080,47104,48128
For these types of things, I will use basic checking, common sense and deffer testing to the wider community. I can always update later.
The Reflex values did not fit into 49088 unless I used a step of 64. 128 missed the range. However, it mentions that the dials turns are 0-127. Looking at Bass Multipy, it’s feasible that this doubles up to have a larger range that fits. Therefore, I selected 64, not 128 increments as this seems to be the best fit.
Error checking and Reflex – “No Adjustment Needed“
It’s funny how these editors take shape. To help with my workflow, I wanted to bake in presets and therefore needed to find the factory bank from for the LXP-1. My eBay LXP-1 had a flat battery and no presets. I searched and searched, posted on forums and found nothing. Eventually, I was put onto a hot lead that the LXP-1 and Reflex share the same types of comms. I eventually found the Reflex factory bank and loaded it in. While testing, the bank had errors based on 16-bit values that would not fit the ranges of the LXP-1 (and Reflex). Something had happened to the factory bank. I then discovered, the Lexicon and Reflex will hold erronous values and store them on the box, most likely moving up or down to a value that the Lexi can handle through some internal error checking. for sending values, this is a bit of a checksum nightmare, especially when sending valid save messages to the Lexicon. Therefore, I investigated the internal resolution and decided I needed to do something special to make everything align.
The solution, clean up the preset upon load. When the SysEX file loads in, my functions calculate the 16 bit value. This, along with the modulator, is passed into my new error checking function. The modulator uses mapped values (for the 16-bit handling) and therefore, technically contains the potential for a table. I loo thrpough the values using LUA, construct a temporary table, then check that the 16-bit value matches and item in the table. A match returns the data and doesn’t waste any more time. If it doesn’t match, the code then works out which value is closest – up or down and the nudges the value accordingly. This leads to a an error correction that will always return a valid checksum when the full data is repackaged as a save command and here it is in action.

In the console output, I switch between a clean preset and dirty preset. The Reverb Relection Level comes out at 41983 which does not match the LXP-1 or Reflex spec. After detection, it adjusts to 41984 which does. Reflection Delay at 38720 nudges lower to the nearest value of 38656. These are values that the LXP-1 and Reflex expect to see and according to the manual, an editor should use values that match the spec and not deviate. Well, I found a clever way to do this, on the fly. Even if a LXP-1 or Reflex value on the box is somehow misaligned – for example – uploading a bad SysEx patch, dodgy memory, old battery, poor midi connection, my editor will knock it into the right location and clean the data. I can see that when working with 16-bit values, this stuff is golden because the numbers are large and the Lexi can actually store bad data. I double checked the 41983 and managed to extract the same number through a different method.
I now have all of the functions ready. Read, write, store. Load presets, error check and save them. Dynmically send 16-bit data to the LXP-1/Reflex for DAW automation and live editing. The final part of the project will now involve double checking that the ranges match the steps in the Lexicon manual for the LXP-1 and Alex and I’m near release. I will have to check all of my functions to attach them to events based from with in the editor else I will come across problems in the VST3/AU version. I’m familiar with this and will fix at the end of the project.
Checkpoint 2
To keep the blog page a little bit more concise, I have added updates to the page here (link).
Testing
Prior to launch, it is vital to test and bugfix. All of my tests and fixes can be found here (link).
More Lexicon LXP-1 software editor programming today. Ported all of the algorithm block diagrams into the project, built the layer switches and arranged the correct amount of modulators per algorithm, into their general locations. I made the LXP-1 sections distinct so that I could blend with the LXP-5 algorithms for the eventual LXP-15 editor.
I am going to approach the LSP-1 by looking at the differences between the LXP-1 and LXP-5. The first and most obvious thing to note is the SysEX byte used to recognise the hardware unit 02. This makes life easier for controlling the algorithms. IF byte 3 = 02 then – it’s the LXP-1.
Last night was a head scratcher and I am super pleased to have pulled it off. The Lexicon LXP-1 provides 7 to 8 and 8 to 7 bit compression over SysEX. Beautifully code and a pain to engineer. All sorted though. I have a really sweet looping function to process the full SysEx chain and make adjustments. Managed to get the whole process to fit into a couple of lines of code and a future – reusable function for more Lexicon projects.
Working on the two-way comms for the Lexicon LXP-1 today and shock horror! No midi OUT/THRU switch. Had to open it up and switch a jumper. Very old school. It was easy though and I recorded the process. It was easier than I thought and I documented everything here: https://monophreak.com/lexicon-lxp-1-internal-midi-jumper/
Well, today has been a toughie but I have succeeded. After building my functions unpacking functions, I have then needed to learn how to shift the high nibble left by 4 bits and add a low nibble, then wrap it up in a way my modulator could understand.
Great progress, all of the algorithms are being layered on correct by sending a message to the LXP-1 to gather information. Packed data is unpacked and then assigned accordingly using a looping routine and then loaded into the modulators. The name is pulled from the preset and displayed, along with the algorithms details, on the LCD. I have reused quite a few elements of the LXP-5 project to speed things along. For the algorithms, I have left some placeholders for Reflex additions.
Okay, thats a bit nuts. I created a call fo the Active System Setup, analysed the bytes and it looks identical (minus one byte) to the Preset dump. Double checked the Reflex manual and found “Active Setup Data dump and Stored Setup Data dump have identical data arrangements”. Well, at least I know. Algorithm is meant to be on bye 65 but appears at the start.
Yesterday seems like a bit of a non-starter because the project has not really moved anywhere but my knowledge has and that is key. So far, I have written functions to unpack SysEx bytes from a packed SysEx string. I have then written a function to build a 16bit byte from two values for each parameter. All good. The next step will be to work out the upper and low ranges of 16bit dials for the LxP-1. I had a good think about this. 7Bitnis nice and easy with a range of 0-127. This is the classic SysEx string. With 16bit, we are looking at very large ranges. I think it was very clever of Lexicon to work this way and it should be easy enough to decode. To complete this action, I will load data into each dial and look for the extreme values. The lowest dial setting and the highest dial setting. I can then look at the range of steps from the manual and make a division to determine the dial increment. Hopefully, I can complete this with minimal wear on my (potentially) crappy JP pots. Good pots on a LXP-1 are more important than the LXP-5. This is because the preset selection from the equivalent of a function dial, limits the range of data from the Delay and Decay dials and it is tied to the function. If a stray midi message leaks out, it will send a message to the Lexicon, re-establishing it’s location on the function dial and switch algorithms. That is a pain. To refresh it, you would then have to add in a preset refresh as part of the automation to make it workable (or complete the fixed pot fox where the encoders/pots are set to a position and then removed).
To add to that – because my mission is all about enabling older boxes to live again with errors, I will enable the preset selection as part of the automation options when I build the VST/AU portion. On my LXP-5, I have a stray encoder sending out random midi values which causes a slight offset. It actually sounds quite charming. A natural analogue detune. When it strays too far, I simple add in an automation parameter that resets the value. I will need to investigate where the stray midi comes from. It may be that it’s a dial which I can assign to a parameter that is switched off. However, for now, it adds a cool vibe that I oike because it’s a slow deterioration and our ears get bored listening to the same sound anyways. This adds in a bit if natural variation so I have chosen not to make any hardware mods to fix it.
Great work on the LSP-1. Mapped in Lexicon Reflex parameters to the main Reverb and altered the algorithm block diagram. I wrote a script to convert 16bit data to two 8bit bytes for the 7bit packing script for a save option. Feels like a mountain to climb but slowly slowly catchy monkey.
Phew! Almost perfectly re-constructed the Lexicon 16bit to 2x8bit splitting routine followed by the packing technique to transmit a preset over SysEx. Getting a perfect output, matching the input including a match for the high data count. Only have the checksum, channel strings and preset storage location left to complete. Why? DAW stuff. One click transmit and a Logic Pro is ready to go. I love old hardware but not the old way of working. Modernisation makes this stuff useful.
Note to self: full save now working. Using a temporary channel value of 10 hardcoded. Need to come back to this and attach to the Channel ID when the send values have been updated.
First algorithm completed. There are range restrictions based upon the actual reverb algorithm. I may need to program these in. For now though, all of the other ranges tend to check out. The Lexicon Reflex table did not contain a step, only the classic 7-bit range. Mapping it all out, I used a step of 64 to get the values needed to hold a preset correctly. It is possible that this may need to be halved but tbh, I’ll wait for someone with a Reflex to try it out and let me know. The actions I took fit the nest and are the most logical so fingers crossed, this is how it works.
It’s crossroads time but before I head there, I’ll provide a quick updated regarding progress. All is great. Every modulator value has been worked out for each algorithm and mapped in. Phew! big job. So now I can load up a Reflex patch into the LXP-1, add the official name from the manual and resave it, pulling out the new SysEX. The Reflex did now have an output for name but this can be retrieved from the MRC. For the factory presets, they litterally list out Preset 1, Preset 2… but I want to make this work as smoothly for my workflow.
So, here is the cross roads. The LXP-1 and Reflex and Reflex Midi Implementation manual both state that the Decay dial controlling Reverb Mid Decay, runs in steps of 16 with an increment of 1024. This indeed, matches the start and end point increments for the ranges stated. If this is the case, why would I obtain a 16-bit value of 38016 for preset 4? Good question. This indicates that using midi, there are a lot more steps than 16. Looking at the divisor, 128 fits this neatly which actually equates to 128 steps. Now, this value is coming from my LXP-1 containing the stored Reflex preset. This means – the Lexi LXP-1 can hold this data. Interesting stuff. On that basis, I think that the 16 values represent the knob but the resolution is much deeper over midi and this means ignoring the step range from the midi implementation guide. I’m going to map in the greater range and I beleive it will correspond to the dial. Obviously, I’ll need to test.
Due to how I write the LUA code which works on complex byte translation, it means that I bit up this type of thing with could otherwise be easily missed. In my script – a value has to translate otherwsie it cannot build the checksum and save. This means it highlights possible issues that can be missed and it makes the editor very robust. I’d really be fascinated to see how this translates to the MRC.
and I forgot – the crossroads. Do I increase the resolution of the dial from 16 to 128 or do I make the value move towards the next closest value? Both would work. The question – what can the Lexi do? Well, if it loaded in a Reflex value of 38016 and stored it on board, then it says to me that it is capable of storing a higher resolution but if the interal resolution will cause the value to simply round it up/down, then it’s misleading to include this in an editor. I’ll have to complete some tests.
I now have the send to LXP-1 functioning. This means I can now read data, update the panel, send a preset and live control an LXP-1. This is great news and I am pleased with how this is shaping up. I’m going to explore the Reflex values in greater detail and look into the interal resolution of the LXP-1 for fine tuning.
Well, that was a very enjoyable challenge. I read through the Reflex and LXP-1 manual to confirm an internal resolution of 16 steps for Mid Reverb Decay. The Lexi happyily accepts many 16 bit numbers but only acts on a few. I ended up writing a routing that looks up the number and nudges it to the closest 16-bit value that the Lexi will accept. So for example, in preset 4, Reverb_Reflection_Level = 41983 (from the SysEx website) but using the division (for my testing), it should be 41984 so I have generated a table of potential values and if there is a mismatch, load up the mapped list from the modulator and shift it to one the Lexicon LXP-1 will accept. The if statement is important. It means the code skips for speed and only acts when it needs to and the shift happens to make the Lexi read and write correctly for importing SysEX files. From some of the Reflex values I downloaded online, generally looked good but there were errors. My code will fix bad SysEX on the fly and load into the LXP-1 and Reflex. It has to save with a valid checksum so this looks great. Phew! a nice puzzle there. This is my soduko! Oddly, never understood soduko.
Over the last two days, I managed to update the byte to modulator scripts so that all of the algorithms now have error correction built in. I updated the Reverb “Halls and Rooms” algorithm to clearly show the extra Reflex controls and I updated the save preset 16bit to 8bit to 7bit repacking script and checksum to handle all lf the algorithms. Pretty good progress. The next task will be to double check the modulator ranges. I will also need to fine tune the graphics for the remaining algorithms. I plan to complete one a day and then move on to cleaning the Reflex factory presets and fixing them inside the editor for quick recall. It’s good progress, by my current rate of working, I expect the editor to be ready by the end of this month so get those coffees ready because I will be looking at the gift pot to see if I can work on another piece of hardware soon.
Algorithm diagrams painstakingly updated and differences between the LXP-1 and Reflex amphasised. It’s looking great. It’s take many, many painstaking revisions to get this right. I felt so good after finally finished flipping the LXP-1/Reflex diagrams vertically so that the left channel is seated… left from the speaker. On page 24 of the Reflex manual, the L Delay clearly flows into the Flange and top Effects Level. This positions the speaker output L R looking at signal flowing in but R L flowing out – if opposite of the signal (i.e. sitting in front of speakers). Therefore, our angle will be in reverse of the diagram. I’m not that advanced to translate this on the fly so wrote it to suit something more natural to my workflow. As with most things music related, lots of tiny changes make big differences. Hope I read this right though but I kept the originals just in case.
Progress is good.. I am currently working my way through testing. During this phase, I turn dials on the actual Lecicon itselft, save a preset, job down the 16-bit value and compare it with the figure I have written. I then refer back to the manual to check that these values match. Sometimes, I have received a value like 94% and thought this was out. Turns out, 94% is correct and with am MRC or software editor, you can push the Lexi further.
Another test involves saving the parameters through my patch save function, checking the extreme values and then removing one step. These tests are going well.
I complete tests to check that the live automation/editing functions work as expected. This test has shown that I working on the correct modulator but the bit conversion does not seem to conform to the msb msb lsb lsb nibbles nor the packed data. My conversions are correct but the output is not triggering the desired effect. For example, using the editor, I turn dials on Reverb Mid Decay up to 50% but the effect on the box leads to 100% – an incorrect value. Therefore, I need to adjust my nibble handling to make it function as expected. Analysing this and making it work will be my plan for today.
After testing, the live mode for automation wasn’t functioning due to a bad channel assignment in the SysEx. Testing revealed the problem and I put in place a nice easy fix. I then tested and confirmed that love values were being sent to the Lexicon which means it can operate in the DAW.
I have only got 4 more algorithms to check and then complete the Reflex factory bank conversion to LXP-1. The bank will then be added as a dropdown menu to the editor.
Created a script to update the destination option, connected to algorithm for the LXP-1 and Reflex. I also finished testing the Gate algorithm.
Only two algorithms left to check. For today, I updated the LXP-1/Reflex switch so that values update pending on the device being used. An example includes the Decay range which looks different on the LXP-1 and Reflex. 0.63 to 8.9s and 0.25 to 6.5s for the Reflex. One click and the values are set. Delay 1 algorithm will also need updating since the top value for the delay in Reflex is 1612ms (each tap set at 20.3ms intervals) as opposed to the 1000ms available in the LXP-1. One click and the device is ready.