Brainstorm: Writing to BomeBox

Sorry, this isn't a Q&A type question - more like a request in case anyone feels like brainstorming.

Have a situation where I create 'masks' for different sequencer tracks On/Off status using bitmapping. Most I have a time is 16 bits for each mask. There's a finite number of masks.

Currently my process is to use a little cheat sheet with columns to determine each tracks masks, and then I enter those values into the Initialisation Translator in MTPro, then upload that to the BomeBox and go.

Well, I'm thinking I want a little less computer and figure if I have a fresh bottle of Xanax in the cabinet I can try something completely insane:

Armed with ONLY a BomeBox and a Sequencer, neither of which will Read/Process SysEx, create a scenario that:

  • While the BomeBox is on, Global Variables are created/stored
  • Call up a 'store' routine, put the Sequencer in [Record], and the BomeBox will send out a series of MIDI Messages that can be 'recorded' into a control track on the Sequencer
  • After session, everything is shut down
  • Upon powering back up, the Sequencer is started up, the Control Track selected, and the Sequencer then sends those values back to the Box which are then stored in the Global Variables

This way, it's sort of like not having the computer there at all...? So basically the Global Variables Initialisation routine will be calc'd off values that are stored in a MIDI Sequence (NOT SysEx, but embedded in perhaps CC values). Note: I already used Shifted States with my controllers, that is, a certain combination of buttons switches the Bome Presets from a Read mode to a Write mode already. I figure it's just a matter of one more 'state'. Thoughts? Crazy? Really: should I just write something custom for an Arduino/rPi? LOL

Interesting,

So you would be using your Sequencer for storing global variables between sessions thereby making them persistent? Nice idea! So you would select a program (make a program change) and then select PLAY, and then have translators to read the output of the sequencer into global variables in MT Pro. You would select a program, send RECORD an then send the global variables to store them? Certainly seems possible as long as your sequencer would support the various commands and that you set up the translators consistently.

 

Steve

 

 

Yeah, I’m trying to wrap my head around the general idea and I’m running into the fact that if I’m just using, say, a CC value then I’m limited to 7 bits, but I think I need 8 bits for an even half of a mask. (Masks in my system are represented by a bitmap, each place is an on/off value – that thing I learned from you)

So storing a string of values would run into a long sequence, but I imagine in regurgitating the Sequencer data back to the Box:
– Sequentially store each value in increasing CC#’s
– The CC Value stores the bitmap mask value
– Using a NoteOn Event as a Shift, or indicate the writing-in-the-box routine to switch to the next variable.

Are there other hidden MIDI parameters that might allow storing more bytes? I can’t do NRPN with my sequencer (Pyramid). I used to do SysEx dumps from my DX7IIFD to my Yamaha RX21 in the old days (I’d use the entire drum machine memory for one song). Does anyone know of any small SysEx capable sequencers or MIDI Data Storage devices?

Oh, I guess I could send PitchBend and parse from there. Hrmm
Do you foresee any other roadblocks using PitchBend?
This sounds like an absolutely stupid and clunky and nearly useless thing to do.

Math:
If I can send 4 bits of data with each CC, and CC goes from 0-127, and then I use a “bank” type change by sending a NoteEvent…that’s 128(Notes)*128(CC’s)*.5 bytes of data (4 usable bits from the CCValue)=8192 bytes of data. Does that calc sound right?

Ouch. I cant find it in the docs, but if i write all the variables into the Box, dont i need a [Restart] routine to refresh the Global Vars? Is there a way to do that remotely? (I know i can do it if im logged in to the box, but hoping i can set a Preset that can be called with a PgmChg or similar msg)

Pitch bend would give you 14 bits (per MIDI channel). The key question is what can your unit record and send. Once we know that we could probably write routines to store and retrieve limited amounts of data if we want. BTW, I’ve asked Florian for the capabilities to store and retrieve global variable in a file “save set”. I know he has a lot on his plate though. I could probably write something for the Arduino given time but it would be cleaner if MT Pro (and BomeBox) could do it stand-alone.

Hurr de Durr.
Well, it’s a thing for me now.

Posting this in case anyone searches considering a similar approach, and just going to jot down some general stuff because yes I did it, but it’s kind of particular to my system in some of the whys.

So I use 16 bit masks to determine which Sequencer Tracks are playing on my Pyramid. I have 3 sets of them, loosely termed Drums, Bass/Rhythm, and Melody/Alt. There’s a total of 26 masks. (There’s 2 extra because I have 2 ‘fill’ buttons on the Drums Groups which represent which tracks are removed before the fill added – so with my fills function, I determine which tracks are replaced and which tracks they’re replaced with during the momentary application of the fill. There’s 2 different fills.)

tl;dr – I have 52 bytes of data in Global Variables that I want to change between songs. I have no place to ‘store’ this data, except a sequencer that does not accept SysEx.

Using only a Sequencer (Squarp Pyramid), a BomeBox with MTPro, and a 4×8 button matrix controller I wanted to be able to Control groups of Tracks (done), and also create the masks and then store them in the sequencer.

My previous approach was to write the masks into an Init routine on the MTPro script, then upload to the Box. Would be fine, except I wanted a less computer approach and be able to change things quicker. Also, if I can store the mask data in the Sequence, then I can change the Masks during a performance in addition to storing data that might change from performance to performance or song to song within the same data file where the rest of the data is, relegating the MTPro script to pure processing (although a little bit of setup data that doesn’t change as often, such as Channels, etc still requires the computer interface).

So I rip each 16 bit mask into four sets of 4 bits and then send them to the sequencer as velocity data in a Note On Event, where the Note # indicates which mask and which set of 4 bits the data belongs to. ie Mask H1 is broken into Notes 0, 1, 2, 3, for bits 1-4, 5-8, 9-12, and 13-16 respectively. I use a button combination to ‘put the system into a mode’ to send out the data, and then it waits for an FA, which comes from turning on [Rec]+[Play] on the sequencer.

Yes, there’s a routine for generating the Note Off Events also, triggered by the same timer with a Delay on the Output

I had built the routine for accepting the data from the sequencer. I’m currently using Channel 15 Note Data from the USB Port of the Pyramid. The routine just takes the Note data, rips off the Velocity value, determines which mask it belongs in, and which set of 4 bits this incoming data is supposed to replace. Then those 4 bits are ‘cleared’, and the new data written in and saved in the Global Variable.

So yeah: 26 masks and it takes 104 notes to communicate that info.

There is no other device that I know of that can do this kind of stuff, unless I were to build an rPi device or something. This is amazing fun!

Update: Just wanted to mention in case anyone wanders by that if I’m writing the values to the variable, they don’t need to be re-initialised. What I was thinking was because sometimes in testing I change the values in the Init Translator, and *that* needs to be reloaded/rerun for those values to take effect.

Hi Jim,
Interesting stuff! As fa as re-initialization, you would run your Init Globals routine first followed by your routine to read (overlay) the variables from your Squarp for the changes you made for that preset. I’ve thought of expanding my program MIDIBuddy to do something similar to what you are doing , I’m also looking at writing a routine for Arduino with an attached MIDI DIN adapter. I’m hoping however that Florian will soon have something built in with MT Pro (and BomeBox) that can save and restore “save sets” that would do similar action. If I get enough user interest, and this feature is not yet available in MT Pro, I might pursue further an Arduino (MIDI Save and Restore ) solution.

Of course right new with a PC there is also sendmidi and rcvmidi in the public domain. The issue with rcvmidi is it doesn’t know when the MIDI stream ends so you have to manually save outside of the MT Pro app. Also these programs do not run on BomeBox so you would still need a computer.

Steve Caldwell
Bome Q and A Moderator and
Independent Bome Consultant/Specialist
bome@sniz.biz