Category Archives: Technology

Benji’s Big Announcement

My animation project

I’ve been writing a keyframe animation OSC front-end for Animata, called OSCimator.

Animata’s web site:

http://animata.kibu.hu/

My project’s SourceForge page:

https://sourceforge.net/projects/oscimator/

New toy: the Nomad Brush

My New and Improving web site

I’ve finally merged the content from solobanjo.com into benjiflaming.com.  I’ve also moved both sites to my own web server.  I’ll be working heavily on this site over the next several days now, and it’s quite probable that I’ll break something in the process (if I haven’t already).  If/when this happens, please feel warmly encouraged to let me know.  Thanks!  :)

25 CD giveaway

In keeping with the proverbial “Christmas spirit”, this December 25th I will be mailing out 25 copies of my solo banjo CD to randomly-selected subscribers to my e-mail list. I’ll also be sending everyone on my e-mail list a link to download an MP3 of my solo banjo Carol of the Bells arrangement.

If you are already subscribed, but you aren’t sure whether you provided your zip/postal code when you signed up (the random-selection program will ignore entries with no zip/postal code), you can check or update your subscription info at:

http://BenjiFlaming.FanBridge.com/

If you are interested in the precise technical details of how the selection process will be handled, below is the complete code listing. It is written in Ruby, although it is not written in particularly good Ruby. I’m a little out-of-practice at the moment, but this is what I cooked up in an hour:

#!/usr/bin/env ruby
# choosewinner.rb

require 'csv'

# These could be parsed from the command-line, if I wrote Ruby more often.
filename = 'entries.csv'
winner_list_filename = 'winners.csv'
winner_count = 25

# empty arrays
entries = []
eligible = []
winners = []

puts "Opening and processing #{filename}"
CSV.open(filename, 'r') do |row|
	entries << row
end
puts "Read #{entries.length} lines"

# The first line of the CSV file contains the column names.  We remove it from
# the list of entries, and extract the column indices from it.
column_names = entries.shift
zipcode = column_names.index("zip")
email = column_names.index("email")
firstname = column_names.index("firstname")
lastname = column_names.index("lastname")

# discard entries which are missing a zipcode or e-mail address
entries.each do |entry|
	eligible << entry if entry[zipcode] and entry[email]
end
puts "Found #{eligible.length} eligible entries out of #{entries.length} total"

# randomly select each winning entry, and remove it from the pool
winner_count.times do
	winner_index = rand(eligible.length)
	winners << eligible[winner_index]
	eligible.delete_at(winner_index)
end
puts "Got #{winners.length} winners:"
puts "----------------------------------------"

# display a summary onscreen, and write the details to a file
File.open(winner_list_filename, 'w') do |winner_list|

	# preserve column names from original CSV file
	winner_list.puts column_names.join(',')

	winners.each do |winner|
		puts "#{winner[firstname]} #{winner[lastname]} #{winner[email]}"
		winner_list.puts winner.join(',')
	end
end
puts "----------------------------------------"
puts "Detailed results written to #{winner_list_filename}"

Getting rid of Google’s new background image

For those of you who, like me, are very annoyed by Google’s decision to force a large background image onto their search page, I offer a workaround. For your convenience (and mine) I’ve created a tiny (203 byte) white image, which conforms to Google’s specifications. You can grab it here:

http://benjiflaming.com/wp-content/uploads/2010/06/white.png

Save it to your computer, upload it to Google, and search page loading times are more-or-less back to normal. Enjoy!

The solo banjo CD has arrived….

…and so has open source media production! After many strange and wondrous adventures, my solo banjo CD is finally available. I’m very pleased to say that all production work was done with free and open source tools under a free and open source operating system. This included recording, editing, mixing, mastering, photo retouching/editing and color correction, album layout/artwork, the editing of the liner notes, and all the other fiddly bits that I’ve forgotten about. I did manually convert the final result into a CorelDRAW file, simply so that I could ensure that the duplication company had a file which would accurately reflect my design in their own working environment, but this was done after the creative part of the process was already completed. The end-result is now available for $15.

PyOrganizer

Some of my free time over the last month or so has been spent writing a piece of financial/budgeting software, which quickly began expanding itself (as my projects often do), and is now attempting to become my personal über-organizer. The program, currently named PyOrganizer, is written in Python, using the GTK+ bindings (PyGTK), and is licensed under the GNU General Public License. I’ve not yet packaged it into a release, but the unstable work-in-progress is always available in the Subversion repository accessible from the SourceForge.net project page.

Tinara marches forward

Life has finally calmed down enough for me to resume work on Tinara – my media production software.  Recently, I have made remarkable progress, due to some significant changes in Tinara’s development roadmap and toolchain:

  • GStreamer is now responsible for reading/writing files, using plug-ins to modify media, and accessing the sound and video hardware.
  • Python is now the primary programming language.
  • The immediate goal is to produce an 8-track recorder/player for the Nokia N810 Internet Tablet, using the tablet’s built-in microphone.

After about a week of tinkering, I was able to produce a working 8-track player (no recording yet) on my N810:

At the time of writing, the current code in the subversion repository is broken, and I’ll need to do some diagnostic work regarding the nuances of scope in Python modules and GTK+ signal handlers, but it should be a relatively short road to a fully-functional multi-track recorder.  More advanced audio editing and processing features won’t be far behind, thanks to the Gnonlin plug-ins for GStreamer, and video editing on more powerful platforms should be relatively easy to implement, since GStreamer is equally adept at both audio and video.

Alpha release getting closer

Development has proceeded rapidly since the recent design modifications and the changeover to Ruby as the primary language. Currently, multiple instances of Tinara’s components (interface, core, and renderer) can be run across multiple machines via TCP sockets. The core loads a rendering tree from disk upon startup, and keeps the on-disk copy up-to-date with any changes to environments or objects.

The next step will be the introduction of basic numeric data types into the rendering engine. This will allow tests to be performed, simple rendering agents to be developed, and the core of the cache system to be implemented.

After that, work on the audio output and graphical interface features can begin. A simple demo “song”, using oscillators as sound sources, can be created, and a demo release could be made (the graphical interface would, at that point, consist of little more than a window with start/stop/rewind buttons).

For a slightly longer and more detailed roadmap of current development/release plans, see the “doc/brain_dumps” file in the SVN repository:

http://svn.sourceforge.net/viewvc/tinara/trunk/doc/brain_dumps?revision=308&view=markup