Hi all,
Usual disclaimer first: I do not work for Bome and this is not official guidance — I am a user sharing what I ran into, and I used an AI assistant to help me read the file format, test the hypotheses and write it up.
After chasing a silence on my live rig for an evening, I found the cause was a naming problem. So I wrote down a convention, together with a script that audits a .bmtp file. Sharing it in case it is useful, and mostly to get it corrected.
The failure it came from. A translator computed a controller number into a variable and put it in the Outgoing Action’s controller slot. A dead-zone branch used ‘Exit rules, execute Outgoing Action’, so it fired before that variable was assigned, emitting CC <whatever was left> = 0. Because the variable was global, ‘whatever was left’ was not bounded by that translator, and some of the values landed in 120-127. Those are Channel Mode messages: All Sound Off, All Notes Off, Poly On. The rig went quiet and nothing in the MIDI monitor looked like a cause.
The convention, in short.
One. Locals are pp qq rr ss tt uu vv ww xx and nothing else. Every other name is global whether you meant it or not. Default to a local: they are scoped per incoming event, so two translators using pp can never interfere.
Two. Give each of the nine a fixed job — rr first data byte, pp second, qq channel, ss tt uu scratch, vv ww extra outputs, xx flag — so two values of the same type inside one chain have obvious homes.
Three. One global head letter per device, never per preset index. Presets get renumbered when you drag them, a keyboard does not. The second character carries the type.
Four. Never put a shared global in a controller-number slot, and use ‘Exit rules, don’t execute’ when a branch means ‘send nothing’.
Five. Write the legend in the translator name, in a Comment rule at the top of the chain, and in the preset’s Comments field. A literal backslash-n is a real line break there, and your own example projects use it that way, one variable per line.
The script reads a .bmtp and reports: names outside both documented ranges, globals written by more than one active preset, variables read in a preset that never writes them, variables read but never written anywhere, Outgoing Actions with a variable in the controller-number slot, and early exits that fire before the assignment they depend on. Read-only.
This overlaps with the ‘Cross-Reference List of all Variables in a MT Pro Project’ thread here and pestrela’s bome_analyse_project.sh, which I only found afterwards. Credit where it is due. Mine is a complement, focused on scope and collisions rather than cross-referencing.
The repository is on GitHub under Beennnn / bome-variable-naming. I cannot post links yet as a new member here, so I will add the URL in a reply once I am allowed to.
Where I need correcting. The scope ranges are assembled from the manual and from old forum threads. I have locals as exactly the nine doubled names, and globals as heads g h i j k l m n y z. If that is wrong or incomplete, in particular what oo or sg actually are, I would rather fix the document than have people rely on it.
Thanks,
(Posting in Bome Products since Tips & Tricks is read-only. A moderator is welcome to move it there if it belongs.)