Posts Tagged ‘solfa’

I’ve set up a git repository for sf2sound. There is a two-voice example there, and JC has written some commentary on it, as well as posted the audio files.

The superposition principle makes this all quite easy — we just add together the waveform files that sf2sound produces for the two voices. That file represents the combined voices, and we use text2sf to produce the audio file. For more voices, simply add more waveform files!

Our work so far is quite primitive, both musically and as a software product. But we are having a lot of fun, and learning a lot. Eventually we hope something polished and elegant will come out of this.


Read Full Post »

Improvements — more shapely waveforms produced by quad2samp eliminates those durn popping sounds — and much more! Source code for quad2samp and sf2sound.py

1 | 2 | 3 | 4 | 5 | 6 |Source Code

Many changes, including new names for the commands. Here is an example:

% sf2sound test '|| fundamental:261 f: tempo:120 | stacc: q do re mi fa | leg: p: h sol sol ||'

And here is the audio:


The dynamics f: and p:, for forte and piano, now work thanks to the improved back-end program quad. I have renamed it quad2samp. The command fundamental:261 sets the frequency in Hertz of do. For longer examples, you can take a file as input:

sf2sound -f theme.solfa

The file theme.solfa represents the first 15 measures of a sonatina in C by Muzio Clementi (Op. 36 No. 1). See the code pages. Here is the sound file:


previous version

Notice that those terrible popping sounds are gone. Eliminating them turned out to be a problem in waveform shaping, which is accomplished in quad2samp using some nice little quadratic functions. I will discuss these improvements and others in the next few posts, as well as give all the source code.

One of the major changes is a clearer idea of what the input language is and can do. I am dubbing the language SF — for solfa, of course. It has three basic entities: note symbols, rhythm symbols, and commands. The symbols can be accented. Thus do+ is an accented do which is interpreted as C#, while do^ is one of two ways to write C an octave above the given C, the other being do2. An important accent for a rhythm symbol is the dot. Just as in music, it increases the value by one-half. Thus q. is a dotted quarter note.

Commands may or may not take arguments. Thus we have tempo:144 but also allegro:. Some commands take more than one argument. An example is cresc:4:f, which means crescendo over four beats to forte. One can also say cresc:4, which means crescendo over four beats from the current level to whatever level results. The rapidity of the crescendo is a default constant which of course can be adjusted: crescendo-speed:1.2. The commands change the values of the “SF” machine that transforms a stream of tokens in the SF language into quadruples. So far this architecture seems to remarkably easy to extend and maintain.

This little project is more work than I bargained for, but it beats playing video games. I am having fun and learning a lot. The Audio Programming Book by Boualanger and Lazzarini is a fantastic resource.


Read Full Post »

In version two of solfa2sf: we can enter rhythm as well as pitch values, and we can control tempo and note decay

1 | 2 | 3 | 4 | 5 | Source Code

Source Code for solfa2sf

The first version of solfa2sf took a string of solfa syllables and produced a .wav sound file representing it. This was good as a start, but we want to do more! In particular, we would like to be able to give different rhythm values to the notes. I’ve posted an improved version of solfa2sf that does just this. One can use the program on the command line like this

solfa2sf foo '| q do2 . e mi2 do2 . q sol sol |'

The result is a file foo.wav:


It represents a melody that starts with a quarter note C above middle C, continues with a pair of eighth notes, and ends with a pair of quarter notes.

To work with longer bits of music, it is best to write the solfa in a text editor, then compute the sound file like this.

solfa2sf -f theme.solfa

The file (theme.solfa) is this text below

| q do2 . e mi2 do2 . q sol sol |
| do2 . e mi2 do2 . q sol sol2 |
| e fa2 mi2 re2 do2 . ti do2 ti do2 |
| re2 do2 ti la . q sol x |

The symbols || . | have no effect on the program and could be omitted. They do help the human who reads or composes tis text, however. The possible rhythm values at this moment are w (whole note), h (half note) q (quarter note), e (eighth note), and s (sixteenth note). The command tempo:120 sets the tempo, and decay:0.1 determines how fast a note trails off into silence: Increase it to make the sound more sustained, decrease it to make it more percussive.

Below is the sound file. Click the link to play it. Do you recognize the piece? I studied it as a child back in Iceland.



Read Full Post »

We combine C and Python programming to transform a sequence of solfege syllables, e.g., do re mi re do, into a sound file.

1 | 2 | 3 | 4 | 5 | Source Code

In our last post we used tfork and a few unix commands to construct a sound file for an A major chord, A C# E A’. The idea was (1) to make text files representing the sounds of the individual notes using tfork, (2) glue the text files end-to-end using cat, (3) convert the resulting big text file into a .wav file using text2sf.

This works fine for short “melodies,” but it soon gets tedious — and out of hand. A better way is to write a short program that does all this for you, given a text string of solfa syllables like “do re mi re do”. This is what we do in the Python program solfa2sf. Below is the sound produced by

./solfa2sf -w foo 0.3 0.1 do re mi re do


SOURCE CODE for solfa2sf

In running solfa2sf, the arguments are as follows: (1) an option: -d for “dry run”, i.e., no output, -v for an output file with verbose messages, -w for wet, the opposite of dry: produces the output .wav file with few messages; (2) the file name; foo results in an output file foo.wav, (3) the note duration in seconds, (4) the decay time, (*) the solfa syllables.

If you use a small decay time, the sound is percussive, like a marimba, or even a drum. If you use a large one, it is more like an organ. Try delay times of 0.01, 0.1, and 1.0 to see what the effect is.

Python is very good with strings, lists, and dictionaries, which is what we need to parse and handle an input string like “do re mi re do’. C is the best tool for fast computation. So we use them together! As you can see from the source code, we call on the C program tfork using the Python command os.system. Like a carpenter, we use saw, chisel, hammer, etc. as needed for the task at hand.


Read Full Post »