Older blog entries for ensonic (starting at number 91)

buzztard

We're heading for a 0.5 release! Most planned features are done and thus its time for testing. I've added some more unit tests. Especially for the dynamic editing, which now finally seems to work quite fine.

I added more keyboard shortcuts to support the workflow people might know from buzz. There is one to start playback from cursor-position and several for cycling through the comboboxes in pattern editor. I started to work on the play-notes functionality in pattern editor too. One can play notes while editing if song is playing already. Need to play the song in a idle-loop otherwise. Also need to figure the horrible latency I get.

One feature that was missing compared to buzz, is that buzz also shows parameters (volume, panorama) of incoming connections in the parameter view. We have this now too.

I also refactored some code in the machines and made monitoring more flexible. As a result the level-meters in the toolbar are now post-gain. Means if you change the volume you see the level-changing accordingly.

Last change of the month is some eye candy. The icons in the machine view don't become blurry when zooming anymore. I also added some simple effects to show the state (desaturizing them or making them half transparent).

LJ has part two of the buzztard article</b> online. Its an interview and tells you all you never wanted to know a bout me and the project.

buzztard

Yay. LJ has a nice online article about buzztard. While helping the author to get the code up & running, I mad several improvments to the configure stuff to make things more obvious, especially when installing not to /usr. I also updated the instructions on the wiki and waffel updated our jhbuild module- set.

The GStreamer buzzmachine plugin now supports an index.txt file in the search path. This is used in buzz to categorize machines. The wrapper plugin adds the categories to the GStreamer classification filed and buzztard-edit uses it to build a structured menu. This helps makes the menu a bit more useful again. Same stuff needed for ladspa (via rdf).

The whole machine graph handling is now getting into 2nd phase. I can already disconnect stuff while playing without breaking things. Adding sources still has issues :/

I also made a series of UI experiemnts. I now have some code for doing properly scaled svgs on gnome-canvas. Sofar the machine icons became blurry when zooming. This was quite noticable in the screenshots of the article. Speaking of those I am suprised that even today, browsers only do nearest neighbour scaling. As graphics is fun, I also hacked some pixbuf filter effect, so that I can get icon variants for selecting and disabling. This will hopefully be integrated in next month. Finally I replaced the VU meter code with the cairo variant from gbo #547490 and made some fixes/improvements.

make me happy again

If you are an ubuntu developer, please dedicate some minutes to this bug report. Not having a working oprofile is quite bad, especially if it looks like all that is needed is to rebuild the package against the right kernel. Thanks, a lot!

buzztard and gobject

Many not so visible code changes this month. Since last Autumn I have GObject introspection enabled if available. So far it has not been that useful due to some wrong use of the GObject in my code. That mostly fix now. Major thing was to change all _new() function to just call g_object_new and utilize the _constructed() and _constructor() vmethods in GObject. That wasn't so easy. Buzztard uses a persistence mechanism to serialize and deserialize objects. It is implemented as an interface. So also this was needing a lot of changes to allow construction from a data storage. Fortunately interfaces are tied to the class, so one can have an interface method that acts as a factory. Main remaining ugliness in the new code is there are some parameters coming from the code and some from the file and its not straight forward to create an object than - I will need to use g_object_newv(), but generating the GParameter array is painful.

buzztard and gstreamer

The second big rewrite that is now also merge to the trunk is the new GStreamer pipeline graph handling. In the past the graph was more or less shallow. Machines, the building blocks of a song in buzztard, are a chain of GStreamer elements. There are volume controls, mixing elements, level meters, converters. They are all plugged as needed. But they were all plugged in the main pipeline. Now machines and wires are bins (containers). That makes it much easier to relink internals and also makes it possible to treat them with normal gstreamer API. As a first feature buzztard now rebuilds the pipeline before playing and used a deep graph scan to only add fully connected parts. That means one can play songs that e.g. have a unconnected source. In the old code this was stalling the pipeline. The UI has now a debug menu in the debugs build. The one and only entry allows to dump a pipeline graph, converts it to png and opens it. Nice to check the constructed pipeline.

There are also some smaller fixes and a few more tests. Its good to have the tests when doing such refactoring :)

buzztard

This month I worked on a couple of small, mostly UI related things, while drafting bigger plans. There where many TODOs in the code for small improvements and now there are less. E.g. I now filter more internal GStreamer properties from ui dialogs. I added some more things to the menus (hide/show statusbar, toggle fullscreen). The sequence view got some fixes - some shortcuts where overlapping, the label column now shows cursor and selection and finally the cursor is clamped to now leave the editable area. I also started adding a debug menu in --enable-debug configuration. The only command right now make a GStreamer pipeline dump as a dot file, converts and shows it.

I received two more translations this month too. I realized that its not always easy to translate the texts and added comments above in the code to give some context.

We're also getting more buzz-a-like. I made the playback start/stop and loop behaving the same way. Now one can start playback from arbitrary positions. Finally I also found and fixed one bug that caused noise in the output of mono-to-stereo buzz machines. Together with some fixes in plugin parameter handling, this makes more songs playing fine now.

As one item from the roadmap for 0.5, I got rid of libgnome usage. Less dependencies, yay! I read this nice autotools tutorial over xmas and fixed a couple of things in my setup. Definitely recommended reading.

buzztard

Finally I have cut a 0.4 release for all buzztard packages. I spend most time before with maintenance tasks, such as i18n updates (we now have dutch and dansk translations!).

I started with some features after the release. There are now some nice gtk-theming improvements for the pattern and the sequence view (we have a custom gtkrc now that extends the theme). Then the audio settings got ui for choosing sampling rate and channels. This will be nice for arm based devices if the cpu power is not enough for high quality as well for doing high sampling rates on fast machines for max quality.

Naturally people try your software once you released it and not before. Thus we got quite some amount bug reports. A lot of them were related to portability, looks like we get it working on BSD. I'll probably do another release soonish.

buzztard

Beginning of October I've been at the Boston Gnome summit and learning about the GObject Introspection project. The project will help to add language bindings to libraries in a easy and consistent way. I added the stuff to buzztard libs and it sort of works a bit already. Cool!

I was showing buzztard to some people at the summit and noticed that samples are not always imported correctly from buzz songs. This is now fixed. I've tries all my songs (~50) and it handles them fine for all now. Along with that, I implemented some missing methods in the buzz emulation layer - sample playback seems to be fully emulated now.

I also looked into some ui issues. One was an obscure repaint issue with gnome- canvas that we use in the machine view. OpenSUSE released an update recently that has the fix. Unfortunately there is no tarball release that has it. I fixed another issue where the canvas became blank. I keep the content position fixed when resizing the window. I was also doing this when the window was bigger than the visible area and that means doing math with NaNs. Fixed. The last UI issue was the self made treeview table header. It did not repaint when scrolling. I tested this with the lovely GTK_DEBUG envvar and the area just stayed red. I got the size requests synced the wrong way between table, viewport and actual content.

The last issue I worked on is the interaction between animated object properties and UIs. We use the GstController to apply the sequence events to the machines. But also users can change parameters while playing. The sequence events are suppressed while changing the parameter (e.g. slider), but unfortunately value springs back once one releases the control, if there are sequence events. Seems that we need some API to keep the sequence disabled until the next control-point.

buzztard

I began the month with the remainder of the namespace cleanups. Should be all fine now. The ktorrent guy was not giving in. Well that's their way of handling it then.

I have registered buzztard with the translation project. All strings are frozen for 0.4. Now of course I look for translators who are willing to help.

During testing, I discovered that for some bpm and tick resolutions, notes where swallowed. This was due to different rounding behaviour in the sequencer and the plugins. This is now fixed. As a side effect, I can now render in any sampling rate. That will help my mameo version :)

buzztard

Out of some irc conversation, I gave implementing synced meters a go. Until so far level and spectrum meters in buzztard were ahead of time. The reason is that gstreamer tells me about the values once they are computed, but that's not when the actual data segment gets played. Luckily the message has a timestamp. So all it needs is to sync drawing with the audio sink. MikeS gave me some good pointers on irc. It wasn't that straight forward. I found and fixed a bug in level meter plugin so that it now puts useful timestamps on messages when it play loops. It works really great now.

gtk_widget_grab_focus() is a nasty function. It asserts when the widget is not mapped/realized and steals the focus in any case. This is problematic if you have tabs and update widgets when things changed. I now have a wrapper added that does the extra checks. Wonder if that would be a good change for upstream.

I did lot of testing with real buzz songs and machines. I have now about 80 original plugins in use. Real testing always leads to some good fixes :) We now add an empty pattern by default when adding new source machines (like buzz did). I also noticed that bpm/tpb information was not loaded from buzz songs. This is now fixed (also master volume was missing). After that I spotted that most bpm tempi did not work well. Now timing precision is much better.

project namespaces

A big recommendation to everyone. Pick a decent prefix for your project. I've been a bit blue eyed and had chosen 'bt'. Part of my package is a core library called libbtcore. Now unfortunately ktorrent did the same mistake and have a libbtcore (bt stands for bittorrent there). As neither of them are really general purpose they should be uniquely named. I analyzed all files I install and went thought the great pains of renaming everything - libs, binaries, docs includes, pkg-config files, desktop files and so on. Hope I never have to do that ever again. I also filed a bug for ktorrent so that they can fix it before its causing problems. Interesting how they dealt with the report - "I was first with libbtcore - RESOLVED AS WONTFIX". Interestingly I was 1.5 years earlier, but that wasn't the point at all.

buzztard

Wow, July went fast. I spend most time with my family. Still a few news from the development front. I worked mostly on wavetable view. It now features more proper sample playback. I wrote a memory audio source for GStreamer. It supports forward and backward playback. This is needed for e.g. ping-pong loops. Also now changing things takes effect while a sample plays. Our waveform widget also shows a playback pointer and loop markers. I also got around to unify and merge duplicated note conversion code. You know, when you've copied something the 3rd time, its time to refactor.

Earlier this month I refactored the song-io plugin API a bit. It has now more metadata. This helps the UI to setup file and recent filters. Unfortunately I had to find out that the mime-type detection in glib was broken. Its at least fixed in trunk. No idea since when it actually worked. As a workaround I am now adding "*.xml" to the filters.

82 older entries...

New Advogato Features

New HTML Parser: The long-awaited libxml2 based HTML parser code is live. It needs further work but already handles most markup better than the original parser.

Keep up with the latest Advogato features by reading the Advogato status blog.

If you're a C programmer with some spare time, take a look at the mod_virgule project page and help us with one of the tasks on the ToDo list!