2018-05-24

Hello,

Here's a progress update for Top ! I would like to say that there's a new build available but that's not true : I prefer to keep v0.0.5 for later, and I will generally space out new builds.

The first few builds of Top ! are indeed unstable and clunky, as they are the product of a work in progress at its early stages. It was important to put them out to give a general idea of what this piece of software will be about, and to build up my motivation and commitment for that project. Now that this first phase is done, and that I'm in the slow process of turning this early prototype into something worth using and shipping, working on it on a regular basis, I feel that I should strive for more stable and usable builds, and focus more on long-term improvements. In this regard, one month can be an amazingly short amount of time, especially with a day job !!

So, I expect Top ! to keep the same set of bare bones features for a while, as I will try to improve its stability and its performance. And I will put new builds online when they reach a higher level of polishing. Growing deeper rather than bigger, or something like that ! After all, we're all here to try to enhance the quality of software, isn't it ?

Anyway, after this brief introspection sequence, what's going on under the hood ?

New save file format

The previous save system was based on a text file format. I had written a quick and dirty grammar and let Yacc generate the parser, which was fine for a first attempt (I had prior experience with Lex/Yacc and the grammar was quite simple), but I felt that it was clunky and not easy to expand. Furthermore, the parser was allocating / initialiazing cues during the parsing, which did not fit very well into the new memory model and caused problems for cues referencing other cues (such as control or mix cues).

So I switched to a much more simple (and robust) binary file format, which has essentially one section for each permanent memory arena of the app and requires minimal conversion between “cold” and “hot” states. You can read the comments from Allen Webster about file formats below this post. Thanks for sharing your thoughts Allen !

(...)

Read more →

2018-02-25

Hello !

This month I started to rewrite the cuelist subsystem of Top !, using a more low level style and trying to avoid the pitfalls of my first implementation.

That subsystem it responsible for organizing the cues into a cuelist (which is really a tree as group cues can contain other cues), allowing the user to select, insert, delete and move cues into the hierarchy. It also dispatches the gui update requests, recursively computes the timing values through the hierarchy to synchronize everybody, and passes the audio rendering requests to each cue. So it is really the backbone of it all.

It was the first part that I prototyped inside Max/MSP as a bunch of, uh, javascript files, and some C externals. I then translated it when the project moved into its full stand-alone form a while ago, and continued to build around that.
Being somewhat old code, it was also bearing the marks of some habits and preconceptions about “pretty code” that I had not yet completely departed from. Some parts were still unnecessary object-oriented (although I had already calmed down on deep inheritance) with a feeling of wanting to be over-generic, and having more layers of abstraction that were needed. And it was like, heavily relying on dynamic allocation. All that for, let's face it, handling a set of rather simple tasks...

(...)

Read more →

2018-01-18

Hello !

Here's the third part of my description of Top's vector graphics renderer. It will discuss the practical aspects of passing down data to the GPU with OpenGL and trying to optimize the performance of the renderer. (it will not explain all the steps to setup and manage OpenGL, so some familiarity with OpenGL API and GLSL may be required).

In Part 1 we saw how paths were built with GraphicsMoveTo(), GraphicsLineTo() and GraphicsCurveTo() functions, and how path stroking was implemented in GraphicsStroke(). In Part 2 we discussed polygon triangulation algorithms and how they were used to fill a path with GraphicsFill(). Our vector graphics system also exposes function to create fonts and gradients, to apply transformations, and to limit drawing to a given area defined by a clipping path. We briefly discuss them in the following paragraphs before addressing the OpenGL code.

(...)

Read more →