I have checked in a very rudimentary example-only four track audio recorder based on my versions of the bare metal Circle and ported Teensy Audio libraries. I hacked my way through the Circle addon UGUI library, starting with the Tiny Oscilloscope example, and then adding my own C++ classes, to get a nominally workable windowing system. For the first time I started testing the audio system in conjunction with some sort-of real world capabilities, namely a mouse and HDMI output.
I need to emphasize that this is a very early preliminary proof-of-concept of a small part of what the system can/will do. Most of the code is actually throw-away, as, for example, I will probably write my own event driven windowing system from the ground up. I will not be, on the other hand, hopefully, re-writing the USB stack, which, thanks to rst, seems to work pretty good at this stage.
I spent some time evaluating available GUI’s that I could port to Circle and came away deciding to write my own because of the same reasons I am doing this project in the first place. Yes, it *might* be possible to port GLUT to the OpenGL 3 work that rst has already done, and then to port GTK on top of that, and then to port a windowing system on top of that, yawn. But part of the whole raison d’etre for this project is to get away from huge stacks of complicated arcane software into a simpler C++ framework that a person can easily understand. Linux is what, 3 million lines of code and takes hours and hours to compile. This program, and Circle, are probably on the order of 50,000 lines and compile in less than a minute.
That being said, the UGUI addon is nice and works well for this simple demo, but I realize that I want to build a complete audio oriented event driven windowing system … with things like MIDI and Audio device control messages built in from the ground up, so this code is more or less, as I said, merely a proof of concept and to test things for a while going forwards.
There were a couple of other personal “firsts” in this foray. The bare metal code is capable of running on a single core or on multiple cores. In multiple-core “mode” it runs the audio and USB interrupts on core 0, the audio processing tasks on core 1, and the UI on core 2. It’s nice to know that there is some horsepower in the barn in case I need it (which I will) in the future, even though in single core mode the simple recorder, even with 4 tracks simultaneously, is using less than 1% of the processor time by certain measurements.
This project also allowed me to delve into visualization of the audio … which came in handy, actually, in finding a bug in one of the audio devices (the “tdm” device I use with the Octo). Sometimes it is hard to deal with zillions of bytes flying by on the wire, but a picture immediately shows you glitch.
So there’s that too …
(p.s. sorry for the image quality ... its a photo of my television taken with my phone ... no hdmi capture at this time).
In any case, I feel like I am now nearly in a position to begin designing the actual system. I have a few different Audio cards working and a basic audio library that can efficiently process sound. There are some audio objects and effects that are workable, including reverb, a sine-wave generator, four channel mixer, and so on, that I can play with. I have a rudimentary UI capability and some understanding of how the real windowing system will work. I believe (and will be proving that) I can hook up a variety of different touch screens, from the official 7” rpi screen down to a 2.5” screen that I got. I have a slew of Teensys and Arduinos with which to develop interesting controllers, and I believe that the USB midi is likely to work “out of the box”.
There's obviously still some stuff to do before writing down my ideas about the Architecture and Design of the system, but at this point, I feel pretty good. I, of course, wonder all the time if I should just chuck this effort and switch to linux, but then I start having fun and getting results from the bare-metal and that keeps me going ...
More later ...