Posted on

TheoryBoard Unboxing

Here it is!

I am so impressed by the people who designed and developed the TheoryBoard. They launched a successful Kickstarter campaign and they not only delivered, but they really increased the value of their product by taking it from prototype to production while adding features and refinements all along the way.

Straight out of the box

I was able to quickly connect the TheoryBoard to my MacBook Pro, open Cubase, and begin recording. The USB cable is all you need if you are using a PC or Mac. I did test it with both external power and USB power only. It works really well!

Powered on and connected via USB

Since I didn’t watch the tutorial yet, here is me just exploring a little. 🙂

Select a scale and test

What I like:
– plug and play
– excellent build quality
– plays chords and scales that sound great without any knowledge of music theory
– light weight and easy to carry
– non-slip base
– pressure-sensitive lighted buttons

What can be improved:

– the symbols for the central display buttons that affect the current scale are not documented in the boxed literature or within the menu system, I’ll have to go online to learn more

– the lighted buttons are pressure-sensitive but require some finesse that I don’t yet have. Sometimes I was able to get the results I desired but there were also times where the result was louder or quieter than expected. Changing the algorithm used for debouncing these inputs might be able to improve this

– the central display indicates when a button is pressed but the lighted buttons themselves do not, it’s personal preference, but I’d like the button I press to dim or turn off for a moment so I know the press was registered there as well

Take aways:

I love this MIDI instrument. My only concern is that I won’t get used to the somewhat finicky response of the lighted buttons. Again, that might be user error, but it definitely has room for improvement. This has been a great first user experience and the bonus of following along with the development of this product has made this a great Kickstarter experience as well.

I’ll try to post again after I have had enough time to really learn how to use this instrument, but if you have the chance to pick one up sooner then I highly recommend you do!

Posted on

Qt project linker error for unresolved external symbol WinMain

Have you even received the following error after adding Qt to your Visual Studio project? The fix is easy but not what you would expect.

MSVCRTD.lib(exe_winmain.obj) : error LNK2019: unresolved external symbol WinMain referenced in function “int __cdecl invoke_main(void)” (?invoke_main@@YAHXZ)

To fix it, Open Properties for the project then go to Linker -> System and change the SubSystem to Not Set from the drop down list. Make sure you do this for All Configurations.

That’s it. Back to work!

Posted on

How to override QTextEdit shortcut key bindings

The only way to override the default shortcuts while the QTextEdit has focus is to intercept the QEvent::ShortcutOverride event. There are 2 ways to intercept this event: 1. write an event filter 2. subclass QTextEdit and then override the virtual event(QEvent* event) method. I prefer this 2nd method (pun intended) because anything that changes the functionality of a widget should probably be its own class.

Here is an example of how I block the QTextEdit from using all shortcuts that start with Ctrl being pressed:

bool CustomTextEdit::event(QEvent *event)
    if(event->type() == QEvent::ShortcutOverride)
        QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
        if(keyEvent->modifiers().testFlag(Qt::ControlModifier) == true)
            // allow override of all Ctrl+ shortcuts
            return false;

    // normal procedure
    return this->QTextEdit::event(event);

Now that the QEvent::ShortcutOverride event has been used to cancel the shortcut, a QAction can be used to capture the shortcut calling setShortcut with the QKeySequence you wish to use. For example:


You can also setup the action directly in Qt Designer like this:

Posted on

PS3 Update Causes 8002F1F9 ERROR

UPDATE! I received information from a website visitor that there is a possible workaround. It sounds a little risky but if your system isn’t working anyway then it’s worth a shot. During the update process, wait for the percent complete value to stop and at that time, while the system is running, remove the SSD drive and then reinsert it. I am told this allows the update process to continue and then you can go on using wired controllers with the latest firmware. I can’t test this because I ended up just buying a used PS3, but please try it at your own risk and I hope it works for you!

This was originally posted here at this link but is certainly worth saying again.

If your PS3 does not connect to your controllers via wireless and you believe it is a problem with your controller, you may be very wrong. The Bluetooth/wireless module in the PS3 may have failed. The system is still 100% usable except if you update the system software when it asks you to the error 8002F1F9 will occur… forever

I just spent hours thinking the firmware I downloaded was corrupt, or the hard drive went bad, or the controller I was using was the problem. No, Nope, and Not that either. Now I have a PS3 that used to work just fine with the wired network and wired controllers sitting here like a brick in a never ending error loop.

Do NOT update the system software of your PS3 if the wireless controllers are not able to connect wirelessly.

Posted on

VirtualBox VM install of Linux Ubunutu or Lubunutu 18

I started to install Lubuntu 18 (a variant of Ubunutu) but the window graphics became corrupted after I selected the language. This is a known bug that sometimes occurs and there are various suggestions to workaround the problem.  What worked for me?

  1. Press Ctrl+Alt+F1
  2. Press Ctrl+Alt+F7
  3. Press Ctrl+Alt+F1

The screen went to a black blinking cursor and then back to normal.

Good luck!

Posted on

RED – how to match lines that don’t contain a character

Time for another Regular Expression of the Day! Let’s say you are looking for all of the lines that don’t have a special character (like an ‘_’ underscore). Here is it:


Start of line, followed by characters that are NOT underscore, followed by End of line

It’s a little confusing that the start of line indicator is a carrot so if you think of it instead as the NOT the end of line indicator it helps

Posted on

Google Cloud SDK – Creating a Guestbook Application

Google left out a lot of steps in their tutorial on using the App Engine to access a Datastore. Not only that, but if you want to run Python 3.x and 2.x on the same machine there are some simple ways to handle it that Google never explains. Here is the run down:

1. download and install python 3.x from the python website. this will include the py.exe python launcher
2. download and install python 2,x because Google doesn’t support 3.x when this was written
3. download and install the google cloud SDK and don’t use their bundled python option
4. when you open the google sdk command prompt, enter this to use the correct python version: SET PY_PYTHON=2

That’s it for the setup portion. Now for the real problem! You cannot execute the ./ python script and have it open a http server as expected. It will run and say something like “update#setState idle”
Also, you will get get an error (ERR_CONNECTION_REFUSED) trying to connect to locahost:8080. You need to do the following instead:

1. as mentioned in the install instructions for google cloud python sdk, you must install the missing python components using gcloud commands from a temp directory somewhere on your computer. This usually works:
cd %TEMP%
2. now enter the gcloud command:
gcloud components install app-engine-python
and when that is done get the extras because it didn’t work for me without them:
gcloud components install app-engine-python-extras
3. now you can run the but you have to use the py.exe launcher to make sure the correct v2 python exe is used, so change directories to where your project is and enter this command:
py “C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\bin\” ./app.yaml
4. open a web browser and go to http://localhost:8080 to see the results