Velato "Hello, World!" tutorial

by Daniel Temkin 5. January 2009 17:11  

The GUIDO Notation System is a very intuitive notation for music, so I'll use it for the coding examples. To convert GUIDO scripts to MIDI files, there's the gmn2midi converter. There are plenty of other notation systems (such as LilyPond) which work equally well.

In GUIDO, notes are represented in the format G0/2, where G is the note, 0 is the octave (equivalent to octave 5 in MIDI), and /2 represents a half-note. If the octave is not provided for a note, it uses the previous note's octave -- same for note durations. Rests are underscores. Comments are Pascal-style (* *) and can be used to track commands within the .gmn file.

The actual program

Okay, let's start with printing the 'H' character to the screen. The Velato command to print a character is Major 6th, Major 5th. If we're writing in C, this is the progression C A G (we always have to start commands with the command root note, which, in this case, is C, as we're starting the program with it).

Looking at the expression list in this post, The expression for a char value is 3rd, 4th. The first 3rd could be major or minor, but since we've used E already, we'll use that, as opposed to E& (which is the GUIDO representation of E-flat).

This we follow with the ASCII value of 'H'. This happens to be 72 (there's a list here), which we represent as "a d#" (we get this from the number of half-steps up from the command root, starting up a half-step, and excluding the Perfect 5th -- it's probably easier to just write it out once and refer to it, like the chart in the last post, here). Unfortunately, we ended up using a d# (equivalent to e&) after all. We can make this more palatable by making it part of a chord, either by combining it with the notes ahead or behind it, or with notes in additional tracks which are not part of the program.

We end the integer with a Perfect 5th, which is G. This gives us the complete command:

[ c a g e f a d# g ]



Click to hear actual midi file

After creating a .mid file with gmn2midi, we use Vlt to compile, and see this abstract syntax tree. This helps us verify that we used the correct notes, and didn't end up with some command we didn't intend:

Program

DeclareFunction

PrintToScreen

CharConstant


Now, let's make it sound a bit better.

We can turn this into several chords: a C6 and an F7. Since we're at the end of a command, we can add a C after (that's our command root), which will be interpreted as No-ops. In Guido, we use curly brackets to indicate notes played together -- the notes of the chord are seperated by comma.

This would give us this:

[ {c-1/4, a1, g0, e } { f/4, a, d#1} _/8 
{ g0/4., c1 } ]



midi file

This is an equivalent command (both print the letter 'H'), but the second is a bit more musical. In addition to creating chords, I've also spread the notes into several octaves and altered the rhythma bit.

Next, let's change the command root note to an F. We do this with a Major 2nd interval, followed by the new root note. In this case:

c d f



Now we write the next command (to print 'e'), starting from F instead of C. The first part of the command is the same, only transposed:

f d c a b&



In ASCII, 'e' is 101, which is g f# g -- we end with a Perfect 5th to indicate the end of an integer, so that's a "c" again. The whole command is:

f d c a b& g f# g c



We can combine this with the previous command ('c d f') and make it a bit more musical:

c0/16 d1 f {f-1/8, d1, c0, a} 
{b&1/4, g-1, f#0} _/8 { g0/4., c1}



entire song so far

It's not going to win us any awards for composition yet, but at least it sounds intentional, instead of a bunch of random notes.

Let's change the command root to B& for a bit of a change, and print the next character, the first 'l'.

The two commands are:

f g b& (* change of command root *)

b& g f d e& c b a& f (* print 'l' *)



Or, once we change the rhythm and octaves:

f0/16 g1 b& (* change of command root *)

{b&-1/8, g1, f0, d} {e&1/4, c0, b0} a&1/8
{f/4, b&} b&0 (* print 'l' *)


entire song so far

The rest of the notes are selected using the same technique. We're not going to win any Grammys with our final program, but it's at least somewhat musical (in a free-form jazz sorta way) instead of random notes. With more time and effort, the song could be further composed into something more pleasing. I'll post any further re-workings of the song here.

Complete "Hello, World" program midi file

GUIDO source for complete program

Here's the program as sheet music. Keep in mind that this set of notes is *not* the actual program; if a MIDI file is created from this progression of notes, the concurrent notes might be interpreted in a different order in the file, and create an invalid program.


Tags: ,