Finding it difficult to resist the urge to irresponsibly spend money I definitely dont have on a new, complicated synthesizer to learn while I’m stuck in my house for the foreseeable future.
Just remembered I have a famously difficult-to-program FM synth from the 80s shoved in my closet. So.... *cracks knuckles* Here we go.
lol this is gonna rule
Literally the NEXT line after this is “The next paragraph in the manual contains a glaring error...”
A E S T H E T I C
Ok. I did something like ~3 hrs of reading before I even went and dug the FB-01 out of my closet. It’s currently on my kitchen table, connected to my computer via a small usb/midi interface. Current plan: send a few of what I THINK are well formulated sysex messages via Max.🤞
I found a few m4L editors (for $$$), which seems like a good sign. But at least one apparently doesnt work anymore, and the one that does has a dev blog where the developer says it was extremely difficult to program. Which seems like a bad sign.
Also: Yes. This is now a radical left synthesizer programming parapandemic twitter acct.
Good news: everything talks nice. First messages effect parameter changes. Throwing random numbers at it, I managed to randomly generate some v nice patches.

Bad news: in order to program this in any USEFUL way ... I need to understand what it’s saying BACK to me. Ruh roh.
I decided to forgo interpreting incoming sysex dumps for decoding parameter change syntax. First step: what are the parameters I can change?

Turns out every instrument on the fb-01 has 4 operators w ADSR and a few other params. There seem to be 7 FM algorithms and 1 master LFO.
What I haven’t figured out is: since a “VOICE” can contain up to 8 “INSTRUMENTS”, how do I / can I control multiple instruments independently via different addresses, and (this may seem weird, but the Fb-01 is weird) can I have more than 1 instrument play at once? I think so?
This is confusing because the manual talks alot about having a voice with multiple instruments, and placing those multiple instruments across different, non-overlapping ranges of keys ... but it never talks of just having them all play on all keys.
Also remember you can, uh, mute conversations on twitter. 😎
Ok. It turns out - I think - that you have to allot a number of keys to each voice that makes up an instrument, with a max of 8 across everything. So you can play a multitimbral patch, but only if each voice has ... “room”? so to speak?
It also looks like you have to have each voice on a separate midi channel, even though they ALSO have “instrument number” addresses ¯\\_(ツ)_/¯ I’m sure theres a reason for this.

I’m gonna go to bed and let this all sink in. Probably wont be back to this for a couple days.
Thinking through this this morning, I think they don’t just overlap MIDI channel and “Instrument Number” because the #fb01 (if you wanna filter these tweets from this pt forward) ALSO has a “System Channel”.
So you communicate param changes to any and all instruments simultaneously on the System Channel by “instrument number”, but you still send note on and off messages to each instrument on its particular MIDI channel. So they do serve different purposes. #fb01
Its not ... good? design? but I think I’m starting to get it. Plus I can only imagine what the memory / architecture restrictions were like in the mid-80s, esp if you were trying to design a low cost unit. #fb01
Anyway, if SENDING IT NOTES is this fiddly, I cannot WAIT to see what it’s like inputting characters to name saved patches for display on the front screen. #fb01
Talked about this on the @funcityventures stream tonight but thought I’d put it here too. Why am I doing this, specifically, to cope with / distract from the virus?

The #fb01 is not only difficult to program, but the manual is difficult to understand (and sometimes just wrong!)
And beyond being difficult to program, most of the original commercial software to program it is no longer available / supported. Which means I’ll have to write a program, to program this synth. #fb01
Doing that kind of thing means I have to pay close, careful attention. I have to close read things, and load a lot of weird esoterica into my brain and then get it all back out in the right order. To make noises!

Doing that... theres no space for The Rona Worries. #fb01
This, for whatever reason, is a combination of things capable of holding my full attention. I’ve somewhat ruined that by committing to twitter updates? But I think it’s also nice to have a use of twitter that isn’t seeing how bad everything is, or shouting about landlords. #fb01
Also, it feels good to have a big, indulgent thread where I don’t really care how many likes the tweets get. That’s not the point. #fb01
What did we learn about the #fb01 this evening? A few things. The sysex syntax - the format of the messages I need to send to get it to do things - is becoming increasingly clear. I’ll make a little chart to explain the broad strokes of that later.
Tonight I was mostly curious about determining if / how an “instrument” can contain up to 8 voices. And it turns out it can! The button combinations to get there are ... weird. And, surprise!, not obvious. #fb01
Basically, starting with one voice in your instrument, you have to go into its setting and reduce its number of available notes to less than 8. Once you’ve reduced the # of notes, you can press the INST *SELECT* button, and that will *ADD* an instrument. #FB01
(as far as I can tell, this is NOWHERE in the #fb01 manual, but there are definitely more than a few completely mind numbing passages / pages)
The addition of a new voice is only indicated by the incrementing of a single numeral on the far left of the readout. Now in Instrument #2, you select a voice for it (“Tubular Bells”), assign it a Midi Channel and number of Notes, up to 8 minus whatever Inst #1 has. #fb01
Repeat for up to 8 voices, 1 note each, per Instrument. The problem is ... I don’t know if I can do this programmatically? It may be made easier by the fact I don’t want to select preexisting voices, just program my own. Orrrr ... that may make it harder? 😬 #fb01
I think I remember some stuff in the manual about Sysex Message scope. Sending messages to the machine vs a voice vs an instrument? Maybe? Definitely looking forward to untangling that poorly translated mystery another evening. #fb01
The mods are asleep. Lets post about synthesizers. #fb01
Have figured out this evening that one can only add new instruments from a particular location in the menu structure - the "NOTES" section - and nowhere else. After a thorough review, I am 100% positive this is *not* in the manual. #fb01
About to look into doing this programmatically. The goal is to be able to give a program a specified, ideally "empty" preset - specify the number of instruments you'd like it to have (up to 8) and then design how each instrument sounds. Store this on the computer, NOT the #fb01.
I've *still* not gone back to attempts at parsing the the #fb01's outgoing midi messages, btw. Hoping, maybe, I don't ... HAVE? ... to listen to it? And can ... just? ... tell it things? If I keep good enough track of the parameters computer-side? Fingers crossed.
Also, very much looking forward to learning how THIS works later. Just a cheeky little pro-tip shoved at the bottom of page 21. #fb01
OH HELL YEAH - programmatically adding instruments to voices is as easy as just pretending they already exist, and sending them data. As was hopefully the case, looks like this'll be 10000% easier over a wire than doing it on the synth itself. #fb01
Also, someone recently asked for pictures of what this all looks like. Here is my extremely not glamorous work station at my kitchen table. V sketchy programming in Max. Interfacing the #fb01 via an iConnectMidi2 normally used for my modular.
Done for now, I think. I got a rough sense of what's possible and converted + transcribed the parameter codes for instrument control. All the messages I've sent up til now have been in a consistent format, but parameter changes, as you can see, all have DIFFERENT formats. #fb01
The next thing I do is go parameter by parameter and build a small bit of code to format the message correctly and send it along, see if it works. Once that's done, I'll cut what I don't need and start figuring out how to put it all together to build "voices". #fb01
My one job for the day just got cancelled so - apologies to the afternoon crowd but ... after lunch, synthesizers incoming. #fb01
A difficulty has arisen. I have to do integer to byte conversion and the #fb01 byte orders are... weird. I've been trying to figure it out for about an hour now, and I think I'm *just* starting to get it but I haven't updated on progress because today looks mostly like this:
I haven't had to do this sort of thing since college. So. On the one hand it's nice. But on the other hand OH MY GOD WHY? WHYYY would you do this this way?

Headed to Evening Zoom Plans (lol) so will probably be back at this tomorrow. #fb01
lolol #fb01
Ugh I'm so close to getting this. It's an extremely irritating problem. It's tough to explain, but basically the high and low segments of each byte are sent in different sized packets (part of the high bit goes with the low). Sussing how to parse that is just... maddening. #fb01
This would probably be a very easy problem for 20 year old me. I think I am just out of practice, and more impatient with these sorts of details than I used to be. #fb01
Spent some time on this last night but didn’t update any. Its coming along, just slow. I’m implementing parameter changes a relatively inelegant way, but a way that is *clear*, which I like. Lets talk about why. #fb01
You have a single byte, communicated via MIDI, to change a parameter. Like say LFO speed. Which goss from 0 to 127. You tell the #fb01 a bunch of stuff it wants to hear, like START MESSAGE and UNIT IDENTIFIER, and then you say “Ok. I’m gonna tell you about LFO speed.”
Then you do, all in a string of many numbers sent one after the other, quickly. The LFO speed part has to be a single byte. Formatted like this, in the #fb01 manual:

%xxxxxxxx

Meaning: you can use the whole 8 bits to represent values from 0 to 127 in dec. BUT ... but but but
You do not send that to the #fb01 in one go. Every parameter change is split into two numbers, two 4 bit segments. You send 0 to 127 as

%xxxx and %xxxx

Two 4 bit segments calculated “separately” and sent in series. FINE. Sure. Weird, but ok whatever. HOWEVER!
What if I want to change Oscillator Feedback or FM Algorithm? Well. Those parameters are sent *together* in one byte, formatted like this

%00xxxyyy

Meaning the segments are

%00xx and %xyyy

Calculated “separately”, but always sent simultaneously. #fb01
There are many more parameters like this, with very little consistency in format. %0xx00yyy %0xx00000 and so one. Each parameter change message has to be hand made. They are bespoke. Artisinal even. There about 80 of them. #fb01
That’s why I’m going slow and making something inelegant but OBVIOUS. If I (or someone else) has to tinker later it’s less likely I’ll trip over my own cleverness.

I’m getting faster at it. But it’s finnicky, and I was never super good at this sorta logic stuff anyway. #fb01
Here we pause for a cute baby civet
OOOOO just got to a parameter where it's first bit is sent alongside one parameter, and the second bit is sent alongside a THIRD parameter. Exciting! #fb01
Keeping track of what I've implemented (👍) vs what I've implemented and tested (✅). Going through the whole operator block, and then will test it all. After that, gonna quadruple the op block (somehow, prob not literally) for the four operators that exist per instrument. #fb01
Whoops. Forgot about the Instrument Block. Gonna implement all these before I do a big bit-by-bit test.

This part should go pretty quick, since the syntax is straightforward, and (whoa) makes logical sense. Or maybe I'm just in too deep, and starting to think like the #fb01
Ok. Time to see how much of this I got wrong. #fb01
I paused to make and eat dinner (curry udon!) but the long and short is: SURPRISINGLY LITTLE. The LFO settings are weirdly inscrutable (see above re: page 21) so I’m not sure if they’re behaving normally. But most everything else appears to work? Whoa. #fb01
Next, I should probably decide if I wanna do checksums (meaning: listen to the #fb01 tell me what IT thinks is going on). That’s going to be a nightmare, pretty much guaranteed, but I at least wanna make an informed decision to not implement it. I’ll do that ... later.
You turn the LFO on by sending the #fb01's LFO Enable address a ... 0. You turn it off by sending a 1.
Very slowly turning this into something that might eventually be usable. I experimented with more elegant solutions - like a dropdown that selects instrument, and then populates associated values - but I keep coming back to: just put everything on screen at once. #fb01
One reason I'm doing it this was because I'm looking forward (I think?) to building a system where selected params will be randomized and those values interpolated between one another. Used judiciously, I think the results might be fun, at least... if not good. #fb01
Now I'm at the operator block controls which I just ... it's so much stuff I don't really care about? But who knows maybe once I have it all implemented I'll figure out it does something cool? :weary: #fb01
woof #fb01
I'm not great at UI, but ... this should be usable. Now We multiply it all (and a bunch more stuff NOT in this screenshot) 8 times... and see what happens. #fb01
Ok thats ... a LITTLE better. I'll tighten it all up once I know it works. Which I've definitely putting off out of fear I've totally messed it all up in the process of organizing it. #fb01
Nice! Top tab row selects which instrument you are currently controlling. Preliminary preset system stores params for each. Doesn't work exactly as envisioned, but I'm gonna try this way first. Maybe means, if done right, I wont have to listen to the #fb01 after all?
A few param controls stopped working after all this fiddling and UI-ing and Preset System Setup-ing, so now I go through bit by bit and test it all. Will probably take a little while, and not produce much to ~report on~. #fb01
Long story short, though: I may be getting dangerously close to uhhhhh ... *making music with it*? #fb01
Fine time to discover there's a SERVICE MANUAL for the #fb01.

Some of this would have been nice to know earlier, but so far it seems like this wouldn't have saved me too much work. Some parts are a little clearer though, like at least it spells out what the acronyms mean.
nice #fb01
0 == on, off == 1, 0 == Max. Value - WHAT KIND OF COUNTRY IS THIS? #fb01
I just wanted to check in on the #fb01 thread and say: still ongoing! I've only done small adjustments in the last couple weeks while I solve other problems needed to move forward (had hardware issues; got what I needed in the mail today!) More here in the next week or two!
In the meantime I've been working on getting better at using Live as hub for Max and SuperCollider, so have a single master transport / tempo / midi-source. That's been fun but ... is kind of a whole other story altogether. And the screenshots have fewer jokes. #fb01
In a strange twist of fate tho, just learned SC numbers its midi channels like the #fb01: starting at 0.

😬
You can follow @mikerugnetta.
Tip: mention @twtextapp on a Twitter thread with the keyword “unroll” to get a link to it.

Latest Threads Unrolled: