...making Linux just a little more fun!

<-- prev | next -->

Songs in the Key of Tux: More Songwrite

By Jimmy O'Regan

This is supposed to be a series, and to be so, it requires at least a second article. In my defence, I haven't had Internet access since the last week of November last—a few days since I submitted my last article, in fact.

In the meantime, I've had plenty of time to get to know Songwrite better. Since December I've been using it exclusively for tablature; I haven't booted Windows once since then. So I have two goals for this article: to pass on what I've picked up in the past four months, and to correct the inaccuracies of my last article.

Songwrite has found a new home. It can now be found at http://oomadness.nekeme.net/en/songwrite/index.html


First things first: corrections. In my last article I said that Songwrite doesn't support whammy bar dives. This isn't strictly true: Songwrite supports downward bends, just not to the extent that a whammy bar can—Songwrite can only support down bends of two semitones. If you try to bend lower than this, it might do it for you, but it'll bend up again, which is rarely what is intended. I'll describe entering bends a bit later.

I also said that Songwrite doesn't support tempo changes. Not only is this incorrect, it's also not what I meant to say. I had meant that it didn't support tempo changes when importing GuitarPro files, but, in fact, it does (though it did miss on the few examples I tried when writing the article, it was successful in later tests more often than not). There is one problem when importing GuitarPro files—the tempos are too fast. This is not Songwrite's fault though, as MIDI files I converted with GuitarPro play too fast as well.

Lastly, I said that Songwrite added an extra string to a file I was working on. I must have done that myself, because repeated use has shown that Songwrite simply doesn't do that. It will, however, maintain the notes which were pasted over the "edge" of the staff, so that the notes can be dragged into the correct location.

One thing to watch out for when using Timidity with Songwrite is that the "Distortion Guitar" sound is an octave too low. This is not a Songwrite problem, though Songwrite uses Timidity for playback (it can also use playmidi, or any other MIDI player). It's not even Timidity's fault, it's the soundfont. Guitar is traditionally transcribed an octave higher than it sounds, and whoever added the "Distortion Guitar" sound was a bit overhelpful.

Tablature Basics

I've already discussed basic note entry, though it's worth noting that you can navigate around the tablature using the arrow keys, instead of having to reach for the mouse every time you want to enter a note. Most features are available from the keyboard - to add a hammer-on or pull-off, press 'h'; to slide, press 's' (for these effects, you need to have a target - Songwrite won't let you hammer-on to nothing); for tremolo, 't'; for bend, 'b'; for roll, 'r'; and to reset to normal, 'n'. You can also set a note's properties by double-clicking on the note and selecting the property you wish to change, or by selecting 'Note->Properties...'. You can also raise and lower the pitch of a note by pressing '+' and '-', respectively, or by simply pressing 'Enter' to get an open note. (Note: This is 'Enter' on the numeric keypad; the other 'Enter' marks a note as "strong").

When you enter a bend, either by using the keyboard or the note properties, you can then select the note properties to set the extent of the bend; 0.5 is a semitone, 1.0 is a whole tone, -1.0 bends down a whole tone etc. Bear in mind that if you have used the note properties to set the bend, you have to dismiss the dialogue and reopen it. Songwrite only supports bends between -1.0 and 1.0 without bending back in the opposite direction though, so watch out!

Note placement

Placing notes in Songwrite is very simple, as I've said before; rather than requiring that the user enter notes and rests linearly, Songwrite simply lets you enter the note where it's required, and there isn't a way to enter rests - simply leave the space blank.

When pasting or moving notes with the mouse, the note duration currently selected determines where you can place the notes. For most music, this means selecting a sixteenth duration before selecting the piece you wish to move/paste—and I mean before, as selecting a different note duration while notes are selected changes their duration (well, what did you expect?). If you forget this, don't worry! Songwrite has a great Undo/Redo facility!

Tied notes

Songwrite's support for tied notes is so simple and obvious that my months of using other tablature programs hid it from me: you don't tie the notes. If you've got a syncopated riff which starts with an eighth note which plays a sixteenth before the beat, you simply place the note a sixteenth before the end of the previous bar, and enter an eighth note. If you're using hammer-ons or pull-offs in a chord, you set the rest of the chord to the entire duration, and simply change the notes where the hammer-on occurs. Songwrite then puts in the rests when you export to Lilypond or MIDI.


Songwrite is set up by default for standard tuning (EADGBE), which is fine for most guitarists, but I use quite a lot of tunings - Drop D from my Helmet rip-off days, Eb from my Slayer rip-off days, C# from my death metal phase (i.e. right now), etc. etc.

The tunings dialogue (or "dialog" if you must) in Songwrite (available from each instrument's 'Properties' button, above the tablature staff) is easy to understand - select the string you wish to tune, and move the slider to the correct note. There is, however, one problem - some notes don't show up on the slider! For example, if I want to use Drop-D tuning, I would expect to be able to just move the slider to 'D', but it skips straight from D# to Db. To get around this, at first I tried creating a blank file, saving it, and then manually editing the file to get the correct tuning. As you might expect, this got really tedious, so I decided to change the source to add the tunings I use regularly.

Since Songwrite is written in Python, the source is installed by default, so I didn't have to go digging in backup CDs for the tarball. By default, Songwrite comes with two guitar tunings available from the 'Partition' menu--'Guitar Standard' and 'Guitar DADGAD'. 'DADGAD' seemed unique, and the only instance I found was exactly what I was looking for: the area where the tunings are defined, in tablature.py

guitar_view_type = view.ViewType("tab", _("Guitar"       ), Tablature, \
{ "strings_args": ((64, 0), (59, 0), (55, 0), (50, 1), (45, 1), (40, 1)) }, 24)
view.ViewType("tab", _("Guitar DADGAD"), Tablature, { "strings_args": \
((62, 0), (57, 0), (55, 0), (50, 1), (45, 1), (38, 1)) }, 24)
view.ViewType("tab", _("Bass"         ), Tablature, { "strings_args": \
((43, 0), (38, 0), (33, 1), (28, 1)) }, 33)
view.ViewType("tab", _("Banjo 5G"     ), Tablature, { "strings_args": \
((62, 0), (59, 0), (55, 0), (50, 0), (Banjo5GString, 67, 0)) }, 105)

Now, I've never used Python before, but this looked straightforward enough, so I dove in and made my changes (after making a copy of the original file, obviously), ran Songwrite and enjoyed my new tunings.

guitar_view_type = view.ViewType("tab", _("Guitar"       ), Tablature, { \
"strings_args": ((64, 0), (59, 0), (55, 0), (50, 1), (45, 1), (40, 1)) }, 24)
view.ViewType("tab", _("Guitar DADGAD"   ), Tablature, { "strings_args": \
((62, 0), (57, 0), (55, 0), (50, 1), (45, 1), (38, 1)) }, 24)
# Helmet, Metallica, Nirvana, Van Halen etc.
view.ViewType("tab", _("Guitar Dropped D"), Tablature, { "strings_args": \
((64, 0), (59, 0), (55, 0), (50, 1), (45, 1), (38, 1)) }, 24)
# Hendrix, Slayer etc.
view.ViewType("tab", _("Guitar Eb"       ), Tablature, { "strings_args": \
((63, 0), (58, 0), (54, 0), (49, 1), (44, 1), (39, 1)) }, 24)
# My crappy Strat copy. I've set this 'cause the tuning dialogue won't let me
# set the correct tuning on the G string. Set to overdriven guitar by default.
# Slayer's later albums use this tuning.
view.ViewType("tab", _("Guitar C#"       ), Tablature, { "strings_args": \
((61, 0), (56, 0), (52, 0), (47, 1), (42, 1), (37, 1)) }, 29)
view.ViewType("tab", _("Bass"            ), Tablature, { "strings_args": \
((43, 0), (38, 0), (33, 1), (28, 1)) }, 33)
#My brother has a 5 string bass as well as a normal bass.
view.ViewType("tab", _("5 String Bass"   ), Tablature, { "strings_args": \
((43, 0), (38, 0), (33, 1), (28, 1), (23, 1)) }, 33)
#I read about this in Guitar World. Possibly an April issue :)
view.ViewType("tab", _("Bassitar"        ), Tablature, {"strings_args": ((43, 0), \
(64, 0), (59, 0), (38, 0), (55, 0), (50, 1), (33, 1), (45, 1), (50, 1), (28, 1)) }, 33)
view.ViewType("tab", _("Banjo 5G"        ), Tablature, { "strings_args": \
((62, 0), (59, 0), (55, 0), (50, 0), (Banjo5GString, 67, 0)) }, 105)

The only parts of that I really understand are "Bassitar" etc. are the names which appear in the menu, and the (64, 0) stuff is the tuning details: one per string, starting with the lowest string; the number for the note (the number which appears in the tuning dialogue); and the "tuning direction" (which doesn't seem to do anything).


Entering lyrics is as simple and logically arranged as everything else - to enter lyrics, you first need to enter the vocal melody. Songwrite then arranges the words beneath the corresponding note. Pressing space or tab moves the cursor underneath the next note, as does entering '-', which cuts the word (which are reassembled in Lilypond's output). 'Enter' brings you on to the next line (though you need to place a double backslash before the newline to have each line show up correctly when printed - see below).

Song Properties

Now, like most other tablature programs out there, Songwrite lets you add information about the song. Unlike other programs, Songwrite uses Lilypond and LaTeX to generate its printed output. A nice side effect of this is that you can write whole articles in Songwrite, with a nice subset of LaTeX. (Which explains why you need to escape newlines in lyrics).

This feature, which seems to be accidental, offers many great possibilities: for a guitar arrangement of a piece of music, you can include the original piece in the comments for comparison; for an article about a piece of music, you could have a scale layout in the printout to correspond with the solo, or show earlier versions of a riff within the document. The best part is, you don't even need to be able to write Lilypond, just use "Export->LaTeX+Lilypond" from another window.


I briefly mentioned Gnometab at the end of my last article; I thought I'd mention it again. Gnometab is very different from Songwrite: it can only be used for laying out tablature - it offers no playback, so if you don't know how to write note durations, you can't use it effectively; it also allows you to write several notes on top of each other, which isn't much help for the beginner.

If, however, you are serious about producing printed tablature, Gnometab produces better looking tablature than Lilypond (which Songwrite uses for printing); and if you've already produced your tab with Songwrite, it's pretty east to redo it using Gnometab regardless of music knowledge.


I did some conversions from the examples which accompanied my last article, but mainly where I had forgotten to add a part, or to fix something. Since then, I've come up with quite a few riffs which were edited directly in Songwrite. You can find them here.


As I mentioned earlier, I haven't had internet access for a while - over six months in fact - and this article was written during that time. Since this article was written, I have gotten Internet access again, and I would like to mention some things in passing.

The next article in this series (and there will be another one, honest!!) will cover recorded sound: the temptations offered by Ardour and Ecasound, coupled with the discovery of a record label that isn't evil, That's what I am working on right now, so watch this space!


[BIO] Jimmy is a single father of one, who enjoys long walks... Oh, right.

Jimmy has been using computers from the tender age of seven, when his father inherited an Amstrad PCW8256. After a few brief flirtations with an Atari ST and numerous versions of DOS and Windows, Jimmy was introduced to Linux in 1998 and hasn't looked back.

In his spare time, Jimmy likes to play guitar and read: not at the same time, but the picks make handy bookmarks.

Copyright © 2004, Jimmy O'Regan. Released under the Open Publication license unless otherwise noted in the body of the article. Linux Gazette is not produced, sponsored, or endorsed by its prior host, SSC, Inc.

Published in Issue 102 of Linux Gazette, May 2004

<-- prev | next -->