From CSWiki
// Canon in D, by Johann Pachelbel
// ChucK program
// Copyright (C) 2007 Pedro López-Cabanillas <plcl@users.sourceforge.net>
// Based on a transcription by Werner Icking. Score available at
// http://icking-music-archive.org/ByComposer/Pachelbel.php
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software Foundation, Inc.
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
VoicForm s1 => JCRev reverb => dac;
0.03 => s1.vibratoGain;
0 => s1.phonemeNum;
VoicForm s2 => reverb;
0.03 => s2.vibratoGain;
1 => s2.phonemeNum;
VoicForm s3 => reverb;
0.03 => s3.vibratoGain;
1 => s3.phonemeNum; //3
VoicForm s4 => reverb;
0.03 => s4.vibratoGain;
1 => s4.phonemeNum; //5
0 => s1.noteOff;
0 => s2.noteOff;
0 => s3.noteOff;
0 => s4.noteOff;
.3 => s1.gain;
.5 => s2.gain;
.5 => s3.gain;
.5 => s4.gain;
.9 => reverb.gain;
.2 => reverb.mix;
// MIDI note constants
36 => int c2; 48 => int c3; 60 => int c4; 72 => int c5; 84 => int c6;
37 => int c2s; 49 => int c3s; 61 => int c4s; 73 => int c5s; 85 => int c6s;
38 => int d2; 50 => int d3; 62 => int d4; 74 => int d5; 86 => int d6;
39 => int d2s; 51 => int d3s; 63 => int d4s; 75 => int d5s; 87 => int d6s;
40 => int e2; 52 => int e3; 64 => int e4; 76 => int e5; 88 => int e6;
41 => int f2; 53 => int f3; 65 => int f4; 77 => int f5; 89 => int f6;
42 => int f2s; 54 => int f3s; 66 => int f4s; 78 => int f5s; 90 => int f6s;
43 => int g2; 55 => int g3; 67 => int g4; 79 => int g5; 91 => int g6;
44 => int g2s; 56 => int g3s; 68 => int g4s; 80 => int g5s; 92 => int g6s;
45 => int a2; 57 => int a3; 69 => int a4; 81 => int a5; 93 => int a6;
46 => int a2s; 58 => int a3s; 70 => int a4s; 82 => int a5s; 94 => int a6s;
47 => int b2; 59 => int b3; 71 => int b4; 83 => int b5; 95 => int b6;
// rest is music too
0 => int r;
// We use musical tempo, and symbolic durations
50.0 => float tempo;
1 => int t1; // whole
2 => int t2; // half
4 => int t4; // quarter
8 => int t8; // eighth
16 => int t16; // 16th
32 => int t32; // 32th
// dotted figures
3 => int t2d; // dotted half
5 => int t4d; // dotted quarter
7 => int t8d; // dotted eigth
fun dur duration(int figure) {
if (figure == t2d )
return duration(t2) + duration(t4);
else if (figure == t4d)
return duration(t4) + duration(t8);
else if (figure == t8d)
return duration(t8) + duration(t16);
else
return 240::second / ( figure * tempo );
}
// basso
[[d3,t4],[a2,t4],[b2,t4],[f2s,t4],[g2,t4],[d2,t4],[g2,t4],[a2,t4]] @=> int basso[][];
// Theme
[[f5s,t4],[e5,t4],[d5,t4],[c5s,t4],[b4,t4],[a4,t4],[b4,t4],[c5s,t4],[d5,t4],[c5s,t4],
[b4,t4],[a4,t4],[g4,t4],[f4s,t4],[g4,t4],[e4,t4],[d4,t8],[f4s,t8],[a4,t8],[g4,t8],
[f4s,t8],[d4,t8],[f4s,t8],[e4,t8],[d4,t8],[b3,t8],[d4,t8],[a4,t8],[g4,t8],[b4,t8],
[a4,t8],[g4,t8],[f4s,t8],[d4,t8],[e4,t8],[c5s,t8],[d5,t8],[f5s,t8],[a5,t8],[a4,t8],
[b4,t8],[g4,t8],[a4,t8],[f4s,t8],[d4,t8],[d5,t8],[d5,t8d],[c5s,t16],[d5,t16],[c5s,t16],
[d5,t16],[d4,t16],[c4s,t16],[a4,t16],[e4,t16],[f4s,t16],[d4,t16],[d5,t16],[c5s,t16],
[b4,t16],[c5s,t16],[f5s,t16],[a5,t16],[b5,t16],[g5,t16],[f5s,t16],[e5,t16],[g5,t16],
[f5s,t16],[e5,t16],[d5,t16],[c5s,t16],[b4,t16],[a4,t16],[g4,t16],[f4s,t16],[e4,t16],
[g4,t16],[f4s,t16],[e4,t16],[d4,t16],[e4,t16],[f4s,t16],[g4,t16],[a4,t16],[e4,t16],
[a4,t16],[g4,t16],[f4s,t16],[b4,t16],[a4,t16],[g4,t16],[a4,t16],[g4,t16],[f4s,t16],
[e4,t16],[d4,t16],[b3,t16],[b4,t16],[c5s,t16],[d5,t16],[c5s,t16],[b4,t16],[a4,t16],
[g4,t16],[f4s,t16],[e4,t16],[b4,t16],[a4,t16],[b4,t16],[a4,t16],[g4,t16],[f4s,t8],
[f5s,t8],[e5,t4],[r,t8],[d5,t8],[f5s,t4],[b5,t4],[a5,t4],[b5,t4],[c6s,t4],[d6,t8],
[d5,t8],[c5s,t4],[r,t8],[b4,t8],[d5,t4],[d5,t4d],[d5,t8],[d5,t8],[g5,t8],[e5,t8],
[a5,t8],[a5,t16],[f5s,t32],[g5,t32],[a5,t16],[f5s,t32],[g5,t32],[a5,t32],[a4,t32],
[b4,t32],[c5s,t32],[d5,t32],[e5,t32],[f5s,t32],[g5,t32],[f5s,t16],[d5,t32],[e5,t32],
[f5s,t16],[f4s,t32],[g4,t32],[a4,t32],[b4,t32],[a4,t32],[g4,t32],[a4,t32],[f4s,t32],
[g4,t32],[a4,t32],[g4,t16],[b4,t32],[a4,t32],[g4,t16],[f4s,t32],[e4,t32],[f4s,t32],
[e4,t32],[d4,t32],[e4,t32],[f4s,t32],[g4,t32],[a4,t32],[b4,t32],[g4,t16],[b4,t32],
[a4,t32],[b4,t16],[c5s,t32],[d5,t32],[a4,t32],[b4,t32],[c5s,t32],[d5,t32],[e5,t32],
[f5s,t32],[g5,t32],[a5,t32],[f5s,t16],[d5,t32],[e5,t32],[f5s,t16],[e5,t32],[d5,t32],
[e5,t32],[c5s,t32],[d5,t32],[e5,t32],[f5s,t32],[e5,t32],[d5,t32],[c5s,t32],[d5,t16],
[b4,t32],[c5s,t32],[d5,t16],[d4,t32],[e4,t32],[f4s,t32],[g4,t32],[f4s,t32],[e4,t32],
[f4s,t32],[d5,t32],[c5s,t32],[d5,t32],[b4,t16],[d5,t32],[c5s,t32],[b4,t16],[a4,t32],
[g4,t32],[a4,t32],[g4,t32],[f4s,t32],[g4,t32],[a4,t32],[b4,t32],[c5s,t32],[d5,t32],
[b4,t16],[d5,t32],[c5s,t32],[d5,t16],[c5s,t32],[b4,t32],[c5s,t32],[d5,t32],[e5,t32],
[d5,t32],[c5s,t32],[d5,t32],[b4,t32],[c5s,t32],[d5,t8],[r,t8],[c5s,t8],[r,t8],[b4,t8],
[r,t8],[d5,t8],[r,t8],[d4,t8],[r,t8],[d4,t8],[r,t8],[d4,t8],[r,t8],[e4,t8],[r,t8],
[r,t8],[a4,t8],[r,t8],[a4,t8],[r,t8],[f4s,t8],[r,t8],[a4,t8],[r,t8],[g4,t8],[r,t8],
[f4s,t8],[r,t8],[g4,t8],[r,t8],[e5,t8],[f5s,t16],[f4s,t16],[g4,t16],[f4s,t16],[e4,t16],
[e5,t16],[f5s,t16],[e5,t16],[d5,t16],[f4s,t16],[d4,t16],[b4,t16],[a4,t16],[a3,t16],
[g3,t16],[a3,t16],[b3,t16],[b4,t16],[c5s,t16],[b4,t16],[a4,t16],[a3,t16],[g3,t16],
[a3,t16],[b3,t16],[b4,t16],[a4,t16],[b4,t16],[c5s,t16],[c4s,t16],[b3,t16],[c4s,t16],
[d4,t16],[d5,t16],[e5,t16],[d5,t16],[c5s,t16],[c4s,t16],[d4,t16],[c4s,t16],[b3,t16],
[b4,t16],[a4,t16],[b4,t16],[c5s,t16],[c4s,t16],[f4s,t16],[e4,t16],[d4,t16],[d5,t16],
[e5,t16],[g5,t16],[f5s,t16],[f4s,t16],[a4,t16],[f5s,t16],[d5,t16],[g5,t16],[f5s,t16],
[g5,t16],[e5,t16],[a4,t16],[g4,t16],[a4,t16],[f4s,t16],[a4,t16],[a4,t16],[a4,t16],
[a4,t16],[a4,t16],[a4,t16],[a4,t16],[f4s,t16],[f4s,t16],[f4s,t16],[f4s,t16],[f4s,t16],
[f4s,t16],[a4,t16],[a4,t16],[g4,t16],[g4,t16],[g4,t16],[d5,t16],[d5,t16],[d5,t16],
[d5,t16],[d5,t16],[d5,t16],[d5,t16],[b4,t16],[b4,t16],[a4,t16],[a4,t16],[e5,t16],
[c5s,t16],[a4,t16],[f5s,t16],[f5s,t16],[f5s,t16],[e5,t16],[e5,t16],[e5,t16],[e5,t16],
[d5,t16],[d5,t16],[d5,t16],[d5,t16],[a5,t16],[a5,t16],[a5,t16],[a5,t16],[b5,t16],
[b5,t16],[b5,t16],[b5,t16],[a5,t16],[a5,t16],[a5,t16],[a5,t16],[b5,t16],[b5,t16],
[b5,t16],[b5,t16],[c6s,t16],[c5s,t16],[c5s,t16],[c5s,t16],[d5,t16],[d4,t32],[e4,t32],
[f4s,t16],[d4,t16],[c4s,t16],[c5s,t32],[d5,t32],[e5,t16],[c5s,t16],[b4,t16],[b3,t32],
[c4s,t32],[d4,t16],[b3,t16],[c4s,t16],[a4,t32],[g4,t32],[f4s,t16],[e4,t16],[d4,t16],
[g4,t32],[f4s,t32],[e4,t16],[g4,t16],[f4s,t16],[d4,t32],[e4,t32],[f4s,t16],[a4,t16],
[g4,t16],[b4,t32],[a4,t32],[g4,t16],[f4s,t16],[e4,t16],[a4,t32],[g4,t32],[f4s,t16],
[e4,t16],[f4s,t16],[d5,t32],[c5s,t32],[d5,t16],[f4s,t16],[a4,t16],[a4,t32],[b4,t32],
[c5s,t16],[a4,t16],[f4s,t16],[d5,t32],[e5,t32],[f5s,t16],[d5,t16],[f5s,t16],[f5s,t32],
[e5,t32],[d5,t16],[c5s,t16],[b4,t16],[b4,t32],[a4,t32],[b4,t16],[c5s,t16],[d5,t16],
[f5s,t32],[e5,t32],[d5,t16],[f5s,t16],[g5,t16],[d5,t32],[c5s,t32],[b4,t16],[b4,t16],
[a4,t16],[e4,t16],[a4,t16],[a4,t16],[a4,t4d],[a4,t8],[d4,t4d],[a4,t8],[g4,t4],[a4,t4],
[g4,t8],[d4,t8],[d4,t8d],[c4s,t16],[d4,t8],[d5,t8],[c5s,t4],[b4,t4],[a4,t4],[d4,t8d],
[e4,t16],[f4s,t4],[b4,t4],[e4,t4],[f4s,t8d],[f5s,t16],[f5s,t16],[g5,t16],[f5s,t16],
[e5,t16],[d5,t8d],[d5,t16],[d5,t16],[e5,t16],[d5,t16],[c5s,t16],[b4,t4],[d5,t4],
[d5,t16],[c5,t16],[b4,t16],[c5,t16],[a4,t4],[a4,t8d],[a5,t16],[a5,t16],[b5,t16],
[a5,t16],[g5,t16],[f5s,t8d],[f5s,t16],[f5s,t16],[g5,t16],[f5s,t16],[e5,t16],[d5,t16],
[c5,t16],[b4,t16],[c5,t16],[a4,t8d],[a4,t16],[g4,t8],[d5,t8],[c5s,t8d],[c5s,t16],
[d5,t8],[d5,t4],[c5s,t4],[b4,t4],[a4,t8],[a4,t8],[g4,t4],[f4s,t4],[r,t16],[e4,t16],
[e4,t4],[f4s,t8],[f5s,t4],[e5,t8],[d5,t8],[d6,t4],[c6,t8],[b5,t4],[d6,t8],[a5,t8],
[b5,t4],[a5,t4],[a5,t4],[a4,t8d],[g4,t16],[f4s,t4],[f5s,t8d],[e5,t16],[d5,t4d],
[d5,t8],[d5,t4],[c5s,t4]] @=> int theme[][];
// Tail fragments
[[d5,t8],[d4,t8],[c4s,t8],[c5s,t8],[b4,t8],[b3,t8],[a3,t8],[a4,t8],
[g4,t8],[g5,t8],[f5s,t8],[f4s,t8],[e4,t8],[b4,t8],[e4,t8],[e5,t8]] @=> int tail_a[][];
[[f5s,t8],[f4s,t8],[e4,t8],[e5,t8],[d5,t8],[d4,t8],[c4s,t8],[c5s,t8],
[b4,t8],[b5,t8],[a5,t8],[a4,t8],[g4,t8d],[e5,t16],[a4,t8],[a4,t8]] @=> int tail_b[][];
fun void playNotes(StkInstrument gen, int notes[][]) {
for( 0 => int i; i < notes.cap(); i++) {
if ( notes[i][0] > 0 ) {
Std.mtof( notes[i][0]) => gen.freq;
1.0 => gen.noteOn;
}
duration( notes[i][1] ) => now;
0.0 => gen.noteOff;
}
}
fun void ostinato() {
for(0 => int count; count < 28; count++) {
playNotes(s1, basso);
}
playNotes(s1, [[d3,t4],[r,t2d]]);
}
Event finished;
fun void voice1() {
playNotes(s2, theme);
playNotes(s2, tail_a);
playNotes(s2, tail_b);
playNotes(s2, [[a4,t4],[r,t2d]]);
finished.broadcast();
}
fun void voice2() {
playNotes(s3, theme);
playNotes(s3, tail_a);
playNotes(s3, [[f4s,t4],[r,t2d]]);
}
fun void voice3() {
playNotes(s4, theme);
playNotes(s4, [[d4,t4],[r,t2d]]);
}
fun void pause() {
duration(1) => now;
duration(1) => now;
}
// Play the whole thing
spork ~ ostinato();
pause();
spork ~ voice1();
pause();
spork ~ voice2();
pause();
spork ~ voice3();
finished => now;