Open Orpheus is under heavy construction. To hear an early result from the synthesizer (a small part of the whole project), have a listen to (the first part of) Bach's Prelude and a look at the Javascript file it was generated from below:
/*
* Prelude No. 2 in C Minor from The Well Tempered Clavier
* by J.S. Bach
*/
var beatsPerMinute = 85;
var currBeat = 0;
function beatLength(beats) { return 60 * beats / beatsPerMinute; };
function startAt(time) { currBeat = time; return currBeat; }
function nextBeat(beats) { currBeat += beatLength(beats); return currBeat; }
function preludeMotif(order, volumes, delay, beatLengths) {
return function(track, notes) {
var n = 0;
for (i in order) {
track.note(notes[order[i]],volumes[n],nextBeat(0.25) + delay, beatLength(beatLengths[n]));
++n;
}
}
}
var preludeMotifUpper = preludeMotif(
[0,1,2,1,3,1,2,1], //note sequence
[80,30,50,60,30,60,40,70], //velocities
0, //delay
[.3,.25,.125,.25,.13,.15,.125,.25] //lengths (in beats)
);
var preludeMotifLower = preludeMotif(
[0,1,2,1,3,1,2,1], //note sequence
[80,30,50,60,70,60,40,70], //velocities
-0.03, //delay
[.2,.12,.125,.3,.13,.15,.125,.25] //lengths (in beats)
);
function playMotifs(track, motif, noteSeqs) {
for (i in noteSeqs) {
motif(track, noteSeqs[i]);
}
}
//"Meat" of song (repetitive part)
track(0).programChange(0,0);
track(0).volume(1.0,0);
startAt(0);
playMotifs(track(0), preludeMotifUpper,
[
["C5", "Eb4", "D4", "C4"], ["C5", "Eb4", "D4", "C4"], //one line == 1 measure
["Ab4", "F4", "E4", "C4"], ["Ab4", "F4", "E4", "C4"],
["B4", "F4", "Eb4", "D4"], ["B4", "F4", "Eb4", "D4"],
["C5", "G4", "F4", "Eb4"], ["C5", "G4", "F4", "Eb4"],
["Eb5", "Ab4", "G4", "Eb4"], ["Eb5", "Ab4", "G4", "Eb4"],
["D5", "F#4", "E4", "D4"], ["D5", "F#4", "E4", "D4"],
["D5", "G4", "F#4", "D4"], ["D5", "G4", "F#4", "D4"],
["C5", "E4", "D4", "C4"], ["C5", "E4", "D4", "C4"],
["C5", "F4", "E4", "C4"], ["C5", "F4", "E4", "C4"],
["Bb4", "F4", "Eb4", "D4"], ["Bb4", "F4", "Eb4", "D4"],
["Bb4", "G4", "F4", "Eb4"], ["Bb4", "G4", "F4", "Eb4"],
["Ab4", "G4", "F4", "Eb4"], ["Ab4", "G4", "F4", "Eb4"],
["Ab4", "D4", "C4", "Bb3"], ["Ab4", "D4", "C4", "Bb3"],
["G4", "Bb3", "Ab3", "Eb4"], ["G4", "Bb3", "Ab3", "Eb4"],
["F4", "C4", "Bb3", "A3"], ["F4", "C4", "Bb3", "A3"],
["F4", "D4", "C4", "B3"], ["F4", "D4", "C4", "B3"],
["F4", "D4", "C4", "B3"], ["F4", "D4", "C4", "B3"],
["Eb4", "C4", "B3", "G3"], ["Eb4", "C4", "B3", "G3"],
["F3", "Eb4", "D4", "F4"], ["F3", "Eb4", "D4", "F4"],
["F#3", "C4", "B3", "Eb4"], ["F#3", "C4", "B3", "Eb4"],
["Eb4", "C4", "B3", "G3"], ["Eb4", "C4", "B3", "G3"],
["F#4", "C4", "B3", "A3"], ["F#4", "C4", "B3", "A3"],
["G4", "C4", "B3", "D4"], ["G4", "C4", "B3", "D4"],
["A4", "C4", "B3", "D4"], ["A4", "C4", "B3", "D4"]
]
);
track(0).trackEnd(nextBeat(2.0));
track(1).programChange(1,0);
track(1).volume(0.4,0);
startAt(0);
playMotifs(track(1), preludeMotifLower,
[
["C3", "G3", "F3", "Eb3"], ["C3", "G3", "F3", "Eb3"],
["C3", "Ab3", "G3", "F3"], ["C3", "Ab3", "G3", "F3"],
["C3", "Ab3", "G3", "F3"], ["C3", "Ab3", "G3", "F3"],
["C3", "Eb3", "D3", "G3"], ["C3", "Eb3", "D3", "G3"],
["C3", "C4", "Bb3", "Ab3"], ["C3", "C4", "Bb3", "Ab3"],
["C3", "A3", "G3", "F#3"], ["C3", "A3", "G3", "F#3"],
["Bb2", "Bb3", "A3", "G3"], ["Bb2", "Bb3", "A3", "G3"],
["Bb2", "G3", "F3", "E3"], ["Bb2", "G3", "F3", "E3"],
["Ab2", "Ab3", "G3", "F3"], ["Ab2", "Ab3", "G3", "F3"],
["Ab2", "D3", "C3", "F3"], ["Ab2", "D3", "C3", "F3"],
["G2", "Eb3", "D3", "G3"], ["G2", "Eb3", "D3", "G3"],
["C3", "Eb3", "D3", "Ab3"], ["C3", "Eb3", "D3", "Ab3"],
["D3", "F3", "Eb3", "Ab3"], ["D3", "F3", "Eb3", "Ab3"],
["Eb3", "G3", "F3", "Ab3"], ["Eb3", "G3", "F3", "Ab3"],
["Eb3", "A3", "G3", "F3"], ["Eb3", "A3", "G3", "F3"],
["D3", "F3", "Eb3", "Ab3"], ["D3", "F3", "Eb3", "Ab3"],
["C3", "F3", "E3", "Ab3"], ["C3", "F3", "E3", "Ab3"],
["C3", "Eb3", "D3", "F3"], ["Bb2", "Eb3", "D3", "F3"], //one different note
["Ab2", "C3", "B2", "D3"], ["Ab2", "C3", "B2", "D3"],
["A2", "Eb3", "D3", "C3"], ["A2", "Eb3", "D3", "C3"],
["G2", "Eb3", "D3", "F3"], ["G2", "Eb3", "D3", "F3"],
["G2", "Eb3", "D3", "C3"], ["G2", "Eb3", "D3", "C3"],
["G2", "Eb3", "D3", "F3"], ["G2", "Eb3", "D3", "F3"],
["G2", "Eb3", "D3", "F3"], ["G2", "Eb3", "D3", "F3"]
]
);
track(1).trackEnd(nextBeat(0.0));