Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Initial collection of examples.

  • Loading branch information...
commit b8a846175f65cc223503b1510c834e148becf852 0 parents
@jbum authored
Showing with 3,735 additions and 0 deletions.
  1. +40 −0 chuck/whitney.ck
  2. +112 −0 flash_actionscript/whitney.as
  3. BIN  flash_actionscript/whitneyChromatic.fla
  4. +318 −0 flash_actionscript/whitneyChromatic.html
  5. BIN  flash_actionscript/whitneyChromatic.swf
  6. +3 −0  midi/_READ_ME.txt
  7. BIN  midi/blues.mid
  8. BIN  midi/blues2.mid
  9. BIN  midi/bluesrev88.mid
  10. BIN  midi/chromatic88.mid
  11. BIN  midi/lydian.mid
  12. BIN  midi/major.mid
  13. BIN  midi/major72.mid
  14. BIN  midi/major72_rev.mid
  15. BIN  midi/major88.mid
  16. BIN  midi/minor.mid
  17. BIN  midi/minor72.mid
  18. BIN  midi/minor72_rev.mid
  19. BIN  midi/minorh.mid
  20. BIN  midi/nonprimemajor.mid
  21. BIN  midi/primeblues.mid
  22. BIN  midi/primebluesrev.mid
  23. BIN  midi/primemajor.mid
  24. BIN  midi/primemajorrev.mid
  25. +23 −0 nyquist/whitney.lsp
  26. +205 −0 perl/makeWhitneyMusic.pl
  27. +51 −0 processing/digital_harmony_examples/whitney_arabesque/whitney_arabesque.pde
  28. +39 −0 processing/digital_harmony_examples/whitney_columna/whitney_columna.pde
  29. +44 −0 processing/digital_harmony_examples/whitney_columnbc/whitney_columnbc.pde
  30. BIN  processing/plus_midi/whitney_crank/data/FranklinGothic-Book-22.vlw
  31. BIN  processing/plus_midi/whitney_crank/data/radial_axis.png
  32. BIN  processing/plus_midi/whitney_crank/data/radial_sweep.png
  33. BIN  processing/plus_midi/whitney_crank/data/radial_sweep.tif
  34. +258 −0 processing/plus_midi/whitney_crank/whitney_crank.pde
  35. +160 −0 processing/plus_midi/whitney_music/whitney_music.pde
  36. +61 −0 processing/plus_pd/pd_whitney_osc/data/makeorgan.pl
  37. +978 −0 processing/plus_pd/pd_whitney_osc/data/organbell~.pd
  38. +16 −0 processing/plus_pd/pd_whitney_osc/data/organplayer.pd
  39. +108 −0 processing/plus_pd/pd_whitney_osc/data/organplayerbells.pd
  40. +280 −0 processing/plus_pd/pd_whitney_osc/data/organ~.pd
  41. +57 −0 processing/plus_pd/pd_whitney_osc/data/rissetbell~.pd
  42. +35 −0 processing/plus_pd/pd_whitney_osc/data/risset~.pd
  43. +72 −0 processing/plus_pd/pd_whitney_osc/data/utils/c_ead.pd
  44. +439 −0 processing/plus_pd/pd_whitney_osc/data/utils/rev3~.pd
  45. +30 −0 processing/plus_pd/pd_whitney_osc/data/voice~.pd
  46. +221 −0 processing/plus_pd/pd_whitney_osc/pd_whitney_osc.pde
  47. +77 −0 processing/visuals_only/whitney_2/whitney_2.pde
  48. +77 −0 processing/visuals_only/whitney_blur/whitney_blur.pde
  49. +31 −0 syd/Whitney2Stage.syd
40 chuck/whitney.ck
@@ -0,0 +1,40 @@
+// Whitney Music Box
+//
+// Jim Bumgardner jbum@jbum.com
+
+48 => int nbrDots;
+55 => float baseFreq;
+180 => float durationOfPiece;
+2.0/nbrDots => float dotGain;
+
+fun void whitneyDot(float baseFreq, float secs, int nDots)
+{
+ StifKarp voc => dac;
+ dotGain => voc.gain;
+ for (0 => int i; i < nDots; ++i)
+ {
+ baseFreq => voc.freq;
+ 1 => voc.noteOn;
+ secs::second => now;
+ 1 => voc.noteOff;
+ }
+}
+
+// Sample Chromatic Pitch Function
+fun float pitchFuncC(float baseFreq, int noteIdx)
+{
+ return baseFreq*Math.pow(2,noteIdx/12.0);
+}
+
+// Sample Reversed Harmonics Pitch Function
+fun float pitchFuncH(float baseFreq, int noteIdx)
+{
+ return baseFreq*(nbrDots-noteIdx);
+}
+
+for (0 => int i; i < nbrDots; ++i)
+{
+ spork ~ whitneyDot(pitchFuncC(baseFreq,i), durationOfPiece/(i+1), i+1);
+}
+
+durationOfPiece::second => now;
112 flash_actionscript/whitney.as
@@ -0,0 +1,112 @@
+// Whitney.as - Jim Bumgardner
+//
+// From ideas by John Whitney -- see his book "Digital Harmony"
+//
+// Version 1.1 - modified for flash 8, and to draw dots instead of filled circles
+// corrected floating point rendering error in center dots
+// by restricting rotation to 0-360
+// 7-29-2007
+
+if (!nbrPoints)
+ nbrPoints = 48;
+if (!cycleLength)
+ cycleLength = 3*60; // 3 minute cycle
+
+// Spin speed
+speed360 = 360*nbrPoints / cycleLength; // Revolutions per second of the fastest point
+ // The slowest node goes 1/nbrPoints this speed.
+
+width = Stage.width;
+height = Stage.height;
+cx = width/2;
+cy = height/2;
+cRad = width/2*.95;
+
+// Function to return a spectrum of color from 0-1
+//
+getColor = function(ratio)
+{
+ var a = 2*Math.PI*ratio;
+ // trace(a);
+
+ var r = 128+Math.cos(a)*127;
+ var g = 128+Math.cos(a+2*Math.PI/3)*127;
+ var b = 128+Math.cos(a+4*Math.PI/3)*127;
+ return (r << 16) | (g << 8) | b;
+}
+
+// Set up the points as movieclips which have their
+// origin at the center. Rotating each clip will spin the dots.
+//
+for (var i = 0; i < nbrPoints; ++i)
+{
+ var mc = _root.createEmptyMovieClip("mc"+i, 100+i);
+ var r = i/nbrPoints;
+ var len = (i+1)*cRad/nbrPoints;
+ var rad = Math.max(2, r*8);
+ mc._x = cx;
+ mc._y = cy;
+ mc.len = len;
+
+ mc.createEmptyMovieClip("dot", 1);
+ mc.dot._x = len;
+ mc.dot._y = 0;
+ mc.dot.clear();
+ mc.dot.lineStyle(rad*2,getColor(r), 100);
+ mc.dot.moveTo(-.2,-.2);
+ mc.dot.lineTo(.2,.2);
+
+ mc.createEmptyMovieClip("outline", 2);
+ mc.outline.clear();
+ mc.outline._x = len;
+ mc.outline._y = 0;
+ mc.outline.lineStyle(rad*2+2,getColor(r) | 0xF0F0F0, 100);
+ mc.outline.moveTo(-.2,-.2);
+ mc.outline.lineTo(.2,.2);
+}
+
+// Animate the points
+startTime = getTimer()*.001;
+_root.onEnterFrame = function()
+{
+ var elapsed = (getTimer()*.001 - startTime);
+
+ // this corrects floating point accumulation errors
+ // which show up in the central dots...
+ if (elapsed >= cycleLength)
+ startTime += cycleLength;
+
+ // var t = elapsed*nbrPoints*360/cycleLength;
+ var t = elapsed*speed360; // optimization for cpu
+ var ti = t/nbrPoints;
+
+ // var tl = elapsed*speed*2*Math.PI;
+ // var tli = tl/nbrPoints;
+ for (var i = 0; i < nbrPoints; ++i)
+ {
+ var mc = _root['mc'+i];
+ // var r = 1-i/nbrPoints;
+ // Draw outline if we passed the 0 degree point
+ var ad = t/360;
+ ad -= int(ad);
+ mc._rotation = ad*360;
+ t -= ti;
+ if (ad < .1) {
+ if (mc.outline._visible == false) {
+ mc.outline._visible = true;
+ mc.outline._alpha = 100;
+ }
+ else {
+ mc.outline._alpha *= .95;
+ }
+ }
+ else
+ mc.outline._visible = false;
+ }
+}
+
+// Draw zero-degree line
+_root.clear();
+_root.lineStyle(.5, 0x555555, 100);
+_root.moveTo(cx,cy);
+_root.lineTo(width, cy);
BIN  flash_actionscript/whitneyChromatic.fla
Binary file not shown
318 flash_actionscript/whitneyChromatic.html
@@ -0,0 +1,318 @@
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+<title>whitneyChromatic</title>
+<script language="JavaScript" type="text/javascript">
+<!--
+//v1.7
+// Flash Player Version Detection
+// Detect Client Browser type
+// Copyright 2005-2008 Adobe Systems Incorporated. All rights reserved.
+var isIE = (navigator.appVersion.indexOf("MSIE") != -1) ? true : false;
+var isWin = (navigator.appVersion.toLowerCase().indexOf("win") != -1) ? true : false;
+var isOpera = (navigator.userAgent.indexOf("Opera") != -1) ? true : false;
+function ControlVersion()
+{
+ var version;
+ var axo;
+ var e;
+ // NOTE : new ActiveXObject(strFoo) throws an exception if strFoo isn't in the registry
+ try {
+ // version will be set for 7.X or greater players
+ axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
+ version = axo.GetVariable("$version");
+ } catch (e) {
+ }
+ if (!version)
+ {
+ try {
+ // version will be set for 6.X players only
+ axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
+
+ // installed player is some revision of 6.0
+ // GetVariable("$version") crashes for versions 6.0.22 through 6.0.29,
+ // so we have to be careful.
+
+ // default to the first public version
+ version = "WIN 6,0,21,0";
+ // throws if AllowScripAccess does not exist (introduced in 6.0r47)
+ axo.AllowScriptAccess = "always";
+ // safe to call for 6.0r47 or greater
+ version = axo.GetVariable("$version");
+ } catch (e) {
+ }
+ }
+ if (!version)
+ {
+ try {
+ // version will be set for 4.X or 5.X player
+ axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
+ version = axo.GetVariable("$version");
+ } catch (e) {
+ }
+ }
+ if (!version)
+ {
+ try {
+ // version will be set for 3.X player
+ axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
+ version = "WIN 3,0,18,0";
+ } catch (e) {
+ }
+ }
+ if (!version)
+ {
+ try {
+ // version will be set for 2.X player
+ axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
+ version = "WIN 2,0,0,11";
+ } catch (e) {
+ version = -1;
+ }
+ }
+
+ return version;
+}
+// JavaScript helper required to detect Flash Player PlugIn version information
+function GetSwfVer(){
+ // NS/Opera version >= 3 check for Flash plugin in plugin array
+ var flashVer = -1;
+
+ if (navigator.plugins != null && navigator.plugins.length > 0) {
+ if (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]) {
+ var swVer2 = navigator.plugins["Shockwave Flash 2.0"] ? " 2.0" : "";
+ var flashDescription = navigator.plugins["Shockwave Flash" + swVer2].description;
+ var descArray = flashDescription.split(" ");
+ var tempArrayMajor = descArray[2].split(".");
+ var versionMajor = tempArrayMajor[0];
+ var versionMinor = tempArrayMajor[1];
+ var versionRevision = descArray[3];
+ if (versionRevision == "") {
+ versionRevision = descArray[4];
+ }
+ if (versionRevision[0] == "d") {
+ versionRevision = versionRevision.substring(1);
+ } else if (versionRevision[0] == "r") {
+ versionRevision = versionRevision.substring(1);
+ if (versionRevision.indexOf("d") > 0) {
+ versionRevision = versionRevision.substring(0, versionRevision.indexOf("d"));
+ }
+ }
+ var flashVer = versionMajor + "." + versionMinor + "." + versionRevision;
+ }
+ }
+ // MSN/WebTV 2.6 supports Flash 4
+ else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.6") != -1) flashVer = 4;
+ // WebTV 2.5 supports Flash 3
+ else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.5") != -1) flashVer = 3;
+ // older WebTV supports Flash 2
+ else if (navigator.userAgent.toLowerCase().indexOf("webtv") != -1) flashVer = 2;
+ else if ( isIE && isWin && !isOpera ) {
+ flashVer = ControlVersion();
+ }
+ return flashVer;
+}
+// When called with reqMajorVer, reqMinorVer, reqRevision returns true if that version or greater is available
+function DetectFlashVer(reqMajorVer, reqMinorVer, reqRevision)
+{
+ versionStr = GetSwfVer();
+ if (versionStr == -1 ) {
+ return false;
+ } else if (versionStr != 0) {
+ if(isIE && isWin && !isOpera) {
+ // Given "WIN 2,0,0,11"
+ tempArray = versionStr.split(" "); // ["WIN", "2,0,0,11"]
+ tempString = tempArray[1]; // "2,0,0,11"
+ versionArray = tempString.split(","); // ['2', '0', '0', '11']
+ } else {
+ versionArray = versionStr.split(".");
+ }
+ var versionMajor = versionArray[0];
+ var versionMinor = versionArray[1];
+ var versionRevision = versionArray[2];
+ // is the major.revision >= requested major.revision AND the minor version >= requested minor
+ if (versionMajor > parseFloat(reqMajorVer)) {
+ return true;
+ } else if (versionMajor == parseFloat(reqMajorVer)) {
+ if (versionMinor > parseFloat(reqMinorVer))
+ return true;
+ else if (versionMinor == parseFloat(reqMinorVer)) {
+ if (versionRevision >= parseFloat(reqRevision))
+ return true;
+ }
+ }
+ return false;
+ }
+}
+function AC_AddExtension(src, ext)
+{
+ if (src.indexOf('?') != -1)
+ return src.replace(/\?/, ext+'?');
+ else
+ return src + ext;
+}
+function AC_Generateobj(objAttrs, params, embedAttrs)
+{
+ var str = '';
+ if (isIE && isWin && !isOpera)
+ {
+ str += '<object ';
+ for (var i in objAttrs)
+ {
+ str += i + '="' + objAttrs[i] + '" ';
+ }
+ str += '>';
+ for (var i in params)
+ {
+ str += '<param name="' + i + '" value="' + params[i] + '" /> ';
+ }
+ str += '</object>';
+ }
+ else
+ {
+ str += '<embed ';
+ for (var i in embedAttrs)
+ {
+ str += i + '="' + embedAttrs[i] + '" ';
+ }
+ str += '> </embed>';
+ }
+ document.write(str);
+}
+function AC_FL_RunContent(){
+ var ret =
+ AC_GetArgs
+ ( arguments, ".swf", "movie", "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
+ , "application/x-shockwave-flash"
+ );
+ AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs);
+}
+function AC_SW_RunContent(){
+ var ret =
+ AC_GetArgs
+ ( arguments, ".dcr", "src", "clsid:166B1BCA-3F9C-11CF-8075-444553540000"
+ , null
+ );
+ AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs);
+}
+function AC_GetArgs(args, ext, srcParamName, classid, mimeType){
+ var ret = new Object();
+ ret.embedAttrs = new Object();
+ ret.params = new Object();
+ ret.objAttrs = new Object();
+ for (var i=0; i < args.length; i=i+2){
+ var currArg = args[i].toLowerCase();
+ switch (currArg){
+ case "classid":
+ break;
+ case "pluginspage":
+ ret.embedAttrs[args[i]] = args[i+1];
+ break;
+ case "src":
+ case "movie":
+ args[i+1] = AC_AddExtension(args[i+1], ext);
+ ret.embedAttrs["src"] = args[i+1];
+ ret.params[srcParamName] = args[i+1];
+ break;
+ case "onafterupdate":
+ case "onbeforeupdate":
+ case "onblur":
+ case "oncellchange":
+ case "onclick":
+ case "ondblclick":
+ case "ondrag":
+ case "ondragend":
+ case "ondragenter":
+ case "ondragleave":
+ case "ondragover":
+ case "ondrop":
+ case "onfinish":
+ case "onfocus":
+ case "onhelp":
+ case "onmousedown":
+ case "onmouseup":
+ case "onmouseover":
+ case "onmousemove":
+ case "onmouseout":
+ case "onkeypress":
+ case "onkeydown":
+ case "onkeyup":
+ case "onload":
+ case "onlosecapture":
+ case "onpropertychange":
+ case "onreadystatechange":
+ case "onrowsdelete":
+ case "onrowenter":
+ case "onrowexit":
+ case "onrowsinserted":
+ case "onstart":
+ case "onscroll":
+ case "onbeforeeditfocus":
+ case "onactivate":
+ case "onbeforedeactivate":
+ case "ondeactivate":
+ case "type":
+ case "codebase":
+ case "id":
+ ret.objAttrs[args[i]] = args[i+1];
+ break;
+ case "width":
+ case "height":
+ case "align":
+ case "vspace":
+ case "hspace":
+ case "class":
+ case "title":
+ case "accesskey":
+ case "name":
+ case "tabindex":
+ ret.embedAttrs[args[i]] = ret.objAttrs[args[i]] = args[i+1];
+ break;
+ default:
+ ret.embedAttrs[args[i]] = ret.params[args[i]] = args[i+1];
+ }
+ }
+ ret.objAttrs["classid"] = classid;
+ if (mimeType) ret.embedAttrs["type"] = mimeType;
+ return ret;
+}
+// -->
+</script>
+</head>
+<body bgcolor="#000000">
+<!--url's used in the movie-->
+<!--text used in the movie-->
+<!-- saved from url=(0013)about:internet -->
+<script language="JavaScript" type="text/javascript">
+ AC_FL_RunContent(
+ 'codebase', 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0',
+ 'width', '500',
+ 'height', '500',
+ 'src', 'whitneyChromatic',
+ 'quality', 'high',
+ 'pluginspage', 'http://www.adobe.com/go/getflashplayer',
+ 'align', 'middle',
+ 'play', 'true',
+ 'loop', 'true',
+ 'scale', 'showall',
+ 'wmode', 'window',
+ 'devicefont', 'false',
+ 'id', 'whitneyChromatic',
+ 'bgcolor', '#000000',
+ 'name', 'whitneyChromatic',
+ 'menu', 'true',
+ 'allowFullScreen', 'false',
+ 'allowScriptAccess','sameDomain',
+ 'movie', 'whitneyChromatic',
+ 'salign', ''
+ ); //end AC code
+</script>
+<noscript>
+ <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="500" height="500" id="whitneyChromatic" align="middle">
+ <param name="allowScriptAccess" value="sameDomain" />
+ <param name="allowFullScreen" value="false" />
+ <param name="movie" value="whitneyChromatic.swf" /><param name="quality" value="high" /><param name="bgcolor" value="#000000" /> <embed src="whitneyChromatic.swf" quality="high" bgcolor="#000000" width="500" height="500" name="whitneyChromatic" align="middle" allowScriptAccess="sameDomain" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/go/getflashplayer" />
+ </object>
+</noscript>
+</body>
+</html>
BIN  flash_actionscript/whitneyChromatic.swf
Binary file not shown
3  midi/_READ_ME.txt
@@ -0,0 +1,3 @@
+The MIDI examples in this directory were produced using the
+makeWhitneyMidi.pl perl script which can be found in the
+perl directory.
BIN  midi/blues.mid
Binary file not shown
BIN  midi/blues2.mid
Binary file not shown
BIN  midi/bluesrev88.mid
Binary file not shown
BIN  midi/chromatic88.mid
Binary file not shown
BIN  midi/lydian.mid
Binary file not shown
BIN  midi/major.mid
Binary file not shown
BIN  midi/major72.mid
Binary file not shown
BIN  midi/major72_rev.mid
Binary file not shown
BIN  midi/major88.mid
Binary file not shown
BIN  midi/minor.mid
Binary file not shown
BIN  midi/minor72.mid
Binary file not shown
BIN  midi/minor72_rev.mid
Binary file not shown
BIN  midi/minorh.mid
Binary file not shown
BIN  midi/nonprimemajor.mid
Binary file not shown
BIN  midi/primeblues.mid
Binary file not shown
BIN  midi/primebluesrev.mid
Binary file not shown
BIN  midi/primemajor.mid
Binary file not shown
BIN  midi/primemajorrev.mid
Binary file not shown
23 nyquist/whitney.lsp
@@ -0,0 +1,23 @@
+; Whitney Music Box in Nyquist -- Jim Bumgardner
+(load "pianosyn")
+
+(setf pdur 60.0)
+(setf tines 48)
+(setf fnote (- 60 (/ tines 2)))
+(defun getstart (k n) (* n (/ pdur (+ 1 k))))
+(defun getdur (k n) (/ pdur (+ 1 k )))
+(defun getpitch (k n) (+ fnote k))
+(defun getvelocity (k n) 50)
+(play
+ (simrep (k tines)
+ (simrep (n (+ 1 k))
+ (at (getstart k n)
+ (piano-note (getdur k n)
+ (getpitch k n)
+ (getvelocity k n)
+ )
+ )
+ )
+ )
+)
+
205 perl/makeWhitneyMusic.pl
@@ -0,0 +1,205 @@
+#!/usr/bin/perl
+
+#
+# makeWhitneyMusic.pl - Jim Bumgardner
+#
+# This Perl script will produce standard MIDI files containing Whitney Music Box sequences.
+#
+# NOTE: Most of the variations on the Whitney Music Box were not
+# made using MIDI. Some of them, such as the ones based on harmonics
+# or on microtones, cannot be made using a MIDI instrument because of
+# the precise tunings involved. Instead, I generated the audio directly
+# using my software synthesizer "Syd". PD (Puredata) is also a good choice.
+#
+# I did use MIDI for some of the later variations which use Piano sounds
+# (particularly #12 and #13. For #11, which uses a different piano sound,
+# I used a more elegant Nyquist script.
+#
+# This is the script I used for #12.
+#
+# - Jim Bumgardner
+
+# use Data::Dumper; # for debugging
+use MIDI;
+
+$syntax = <<EOT;
+
+makeWhitneyMidi [options]
+
+-o outfile name of output file (default=o.mid)
+-tines n nbr tines
+-len l length of piece (in minutes, default=3)
+-amp a max-amplitude (default=300)
+-rev reverse pitches
+-rise rising pitches (k*n % tines)
+-primes prime numbers
+EOT
+
+$ofile = 'o.mid';
+$tempo = 60; # beats per minute
+$ticksPerBeat = 960; # ticks per beat
+
+$mEventList = []; # midi event lists for each voice
+push @{$mEventList},['raw_meta_event', 0, 33, "\x00"]; # select piano patch (0)
+push @{$mEventList},['control_change', 0, 0, 7, 64]; # default volume = 64
+
+$nbrTines = 88;
+$lenPiece = 3*60;
+$maxAmp = 300;
+$rev = 0;
+$xor = 0;
+$rise = 0;
+$primes = 0;
+
+@ptab = ( 2, 3, 5, 7, 11, 13, 17, 19, 23, 29,
+ 31, 37, 41, 43, 47, 53, 59, 61, 67, 71,
+ 73, 79, 83, 89, 97, 101, 103, 107, 109, 113,
+ 127, 131, 137, 139, 149, 151, 157, 163, 167, 173,
+ 179, 181, 191, 193, 197, 199, 211, 223, 227, 229,
+ 233, 239, 241, 251, 257, 263, 269, 271, 277, 281,
+ 283, 293, 307, 311, 313, 317, 331, 337, 347, 349,
+ 353, 359, 367, 373, 379, 383);
+
+while ($_ = shift)
+{
+ if (/^-tines/)
+ {
+ $nbrTines = shift;
+ }
+ elsif (/^-len/)
+ {
+ $lenPiece = (shift) * 60;
+ }
+ elsif (/^-amp/)
+ {
+ $maxAmp = shift;
+ }
+ elsif (/^-rev/)
+ {
+ $rev = 1;
+ }
+ elsif (/^-xor/)
+ {
+ $xor = 1;
+ }
+ elsif (/^-rise/)
+ {
+ $rise = 1;
+ }
+ elsif (/^-primes?$/)
+ {
+ $primes = 1;
+ }
+ elsif (/^-o$/)
+ {
+ $ofile = shift;
+ }
+ else {
+ print $syntax;
+ exit;
+ }
+}
+
+sub kToPitch($$)
+{
+ my ($k,$n) = @_;
+
+ my $fPitch = int(64-$nbrTines/2);
+ $fPitch = 21 if $fPitch < 21;
+
+ $k = $k ^ 0x02A if ($xor);
+ if ($rev)
+ {
+ return ($fPitch+$nbrTines) - $k;
+ }
+ if ($rise) {
+ return $fPitch + ($k + $k*$n)%$nbrTines;
+ }
+ else {
+ return $fPitch + $k;
+ }
+}
+
+sub kToTime($$)
+{
+ my ($k, $i) = @_;
+ return ($i * $lenPiece/kToCount($k))*$ticksPerBeat;
+}
+
+sub kToDuration($$)
+{
+ my ($k, $i) = @_;
+ my $d = $lenPiece/kToCount($k);
+
+ $d *= .5;
+ # $d = 10 if ($d > 10);
+
+ return $d * $ticksPerBeat;
+}
+
+sub kToVelocity($$)
+{
+ my ($k, $i) = @_;
+ return 64;
+}
+
+sub kToCount($)
+{
+ my ($k) = @_;
+ return $ptab[$k] if $primes;
+ return ($k+1);
+}
+
+
+@myEList = ();
+
+foreach $k (0..$nbrTines-1)
+{
+ foreach $n (0..kToCount($k)-1)
+ {
+ push @myEList, { t=>kToTime($k,$n),
+ pitch=>kToPitch($k,$n),
+ vel=>kToVelocity($k,$n)};
+ push @myEList, { t=>kToTime($k,$n)+kToDuration($k,$n),
+ pitch=>kToPitch($k,$n),
+ vel=>0};
+ }
+}
+
+# print Dumper(\@myEList);
+
+
+$lTicks = 0;
+foreach $e (sort {$a->{t} <=> $b->{t}} @myEList)
+{
+ $offset = int($e->{t} - $lTicks);
+ push @{$mEventList}, ['note_on', $offset, 0, int($e->{pitch}), int($e->{vel})];
+ $lTicks += $offset;
+}
+
+# print Dumper($mEventList);
+
+my $op = MIDI::Opus->new({
+'format' => 1,
+'ticks' => $ticksPerBeat, # ticks per quarternote
+'tracks' => [ # 2 tracks...
+
+# Track #0 ...
+MIDI::Track->new({
+ 'type' => 'MTrk',
+ 'events' => [ # 3 events.
+ ['time_signature', 0, 4, 2, 24, 8],
+ ['key_signature', 0, 0, 0],
+ ['set_tempo', 0, int(1000000*60/$tempo)], # microseconds per quarter note
+ ]
+}),
+
+# Track #1 ...
+MIDI::Track->new({
+ 'type' => 'MTrk',
+ 'events' => $mEventList
+ }),
+
+]
+});
+$op->write_to_file("$ofile");
51 processing/digital_harmony_examples/whitney_arabesque/whitney_arabesque.pde
@@ -0,0 +1,51 @@
+// Transcription of program arabesque
+// originally prepared by Paul Rother for John Whitney for the book "Digital Harmony"
+// ported to the Processing language by Jim Bumgardner
+
+static float deg=PI/180;
+
+float stepstart = 0,
+ stepend = 1/60.0,
+ xleft = 38,
+ ybottom = 18,
+
+ radius = 85,
+ xcenter,
+ ycenter;
+
+int npoints = 360,
+ nframes = 32,
+ frame = 0,
+ ilength = 170;
+
+void setup()
+{
+ size(640,480);
+ xleft = width*.1;
+ radius = height*.88/2;
+ xcenter = width/2;
+ ycenter = height/2;
+ frameRate(24);
+ noStroke();
+ fill(255);
+}
+
+void draw()
+{
+ background(0); // erase
+
+ float ftime = millis()*.0001;
+ float step = stepstart + (ftime * (stepend - stepstart));
+
+ for (int i = 0; i < npoints; ++i)
+ {
+ float ratio = i/(float)npoints;
+ float r = 3*radius;
+ float a = -90 + 360 * ratio;
+ float x = cos(a*deg) * ratio + i*step*r;
+ int ix = (int) (xcenter - (r/2) + int(x+r/2)%Math.round(r));
+ int iy = int( ycenter + sin(a*deg) * radius );
+ ellipse(ix, iy, 4,4);
+ }
+}
+
39 processing/digital_harmony_examples/whitney_columna/whitney_columna.pde
@@ -0,0 +1,39 @@
+// Transcription of program columnA
+// originally prepared by Paul Rother for John Whitney for his book "Digital Harmony"
+// ported by Jim Bumgardner
+
+static float deg=PI/180;
+
+float stepstart = 0,
+ stepend = 1/60.0,
+ xleft = 38,
+ ybottom = 18;
+
+int npoints = 60,
+ nframes = 30,
+ ilength = 170;
+
+void setup()
+{
+ size(280,192);
+ frameRate(10);
+ noStroke();
+ fill(255);
+}
+
+void draw()
+{
+ background(0); // erase
+ float ftime = millis()*.001;
+ float step = stepstart + (ftime * (stepend - stepstart));
+
+ for (int point = 0; point < npoints; ++point)
+ {
+ float x = xleft + ilength * point/(float)npoints;
+ float y = ilength * point * step;
+ y = ybottom + ( Math.round(y) % ilength );
+ ellipse((int) x, (int) y, 4, 4);
+ // set((int) x, (int) y, color(255));
+ }
+}
+
44 processing/digital_harmony_examples/whitney_columnbc/whitney_columnbc.pde
@@ -0,0 +1,44 @@
+// Transcription of program columnBC
+// originally prepared by Paul Rother for John Whitney for the book "Digital Harmony"
+// ported to the Processing language by Jim Bumgardner
+
+float stepstart = 0,
+ stepend = 1/60.0,
+ xleft = 38,
+ ybottom = 18,
+
+ radius = 85,
+ xcenter = 140,
+ ycenter = 96,
+ speed = .1;
+
+int npoints = 360,
+ ilength = 170;
+
+void setup()
+{
+ size(500,500);
+ radius = height*.9/2;
+ xcenter = width/2;
+ ycenter = height/2;
+ frameRate(24);
+ noStroke();
+ fill(255);
+}
+
+void draw()
+{
+ background(0); // erase
+ float ftime = millis()*.001*speed;
+ float step = stepstart + (ftime * (stepend - stepstart));
+
+ for (int i = 0; i < npoints; ++i)
+ {
+ float a = 2*PI * step * i;
+ float radiusi = radius; // radius*sin(a*ftime); VERY NICE
+ float x = xcenter + cos(a) * (i/(float)npoints) * radiusi;
+ float y = ycenter + sin(a) * (i/(float)npoints) * radiusi;
+ ellipse((int) x, height-(int) y, 4,4);
+ }
+}
+
BIN  processing/plus_midi/whitney_crank/data/FranklinGothic-Book-22.vlw
Binary file not shown
BIN  processing/plus_midi/whitney_crank/data/radial_axis.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  processing/plus_midi/whitney_crank/data/radial_sweep.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  processing/plus_midi/whitney_crank/data/radial_sweep.tif
Binary file not shown
258 processing/plus_midi/whitney_crank/whitney_crank.pde
@@ -0,0 +1,258 @@
+// Whitney Music Box - a Processing + MIDI implementaton - 10/17/2008 Jim Bumgardner
+//
+// Todo - fix for negative time.
+//
+// See what's going on with visual feedback.
+// Fix line to look better (see RadialSweep.pde)
+// Add visual crank?
+
+
+import rwmidi.*;
+
+MidiOutput midiOutput;
+
+// Modify these to your taste...
+int kMaxNbrPoints = 128;
+int nbrPoints = 20; // number of notes
+int lowestNoteNumber = 69; // 69 = A 440
+boolean reversePitches = false;
+String[] titles = {"Whitney Music Box","Var. 17","Hand-cranked"};
+int kVariationLength = 60*1000;
+int kMidiChannel = 0; // HARPSICHORD IS GOOD
+int kDefaultVelocity = 90;
+
+
+float cycleLength = 3 * 60; // 3 Minute Cycle
+final int kDefWidth = screen.width;
+final int kDefHeight = screen.height;
+
+int kWidth = kDefWidth; // width of graphics
+int kHeight = kDefHeight; // height of graphics
+int kNoteDuration = 8000; // 8000
+int cx = kWidth/2,cy = kHeight/2; // center coordinates
+float circleRadius;
+float[] tines; // keeps track of current position of note, by angle
+long[] lastSound; // keeps track of time last note sounded
+boolean[] isOn;
+boolean isMute = false;
+float angD = 0;
+
+PFont titleFont;
+long startOfVariation;
+
+PImage bgImage;
+
+int[] diatonic = {0,2,4,5,7,9,11};
+int[] blues = {0,3,4,5,6,7,10};
+int[] blues2 = {0,2,3,4,5,6,7,10};
+int[] minor = {0,2,3,5,7,8,10};
+int[] minorh = {0,2,3,5,7,8,11};
+
+int[] pscale = blues;
+int lenScale = pscale.length;
+
+
+
+void setup()
+{
+ size(kDefWidth, kDefHeight);
+ circleRadius = (min(width,height)/2) * 0.95;
+ noStroke();
+ smooth();
+ colorMode(HSB, 1);
+ background(0);
+
+ tines = new float[kMaxNbrPoints];
+ lastSound = new long[kMaxNbrPoints];
+ isOn = new boolean[kMaxNbrPoints];
+ for (int i = 0; i < kMaxNbrPoints; ++i)
+ {
+ tines[i] = -10;
+ lastSound[i] = millis();
+ isOn[i] = false;
+ }
+
+ // Show available MIDI output devices here
+ MidiOutputDevice devices[] = RWMidi.getOutputDevices();
+ for (int i = 0; i < devices.length; i++) {
+ println(i + ": " + devices[i].getName());
+ }
+ // Currently we assume the first device (#0) is the one we want
+ midiOutput = RWMidi.getOutputDevices()[0].createOutput();
+ println("\nPress SPACE to MUTE (all notes off)");
+ titleFont = loadFont("FranklinGothic-Book-22.vlw");
+ textFont(titleFont, 22);
+ startOfVariation = millis();
+
+ bgImage = loadImage("radial_axis.png");
+ frameRate(24); // Helps keep CPU usage down..
+ resetBox();
+}
+
+void resetBox()
+{
+ startOfVariation = millis();
+ reversePitches = !reversePitches;
+ pscale = null;
+
+ switch (int(random(3))) {
+ case 0: nbrPoints = 32; break;
+ case 1: nbrPoints = 48; break;
+ case 2: nbrPoints = 60; break;
+ }
+ lowestNoteNumber = 64-nbrPoints/2;
+ String scaleStr = "";
+ if (nbrPoints < 60 && int(random(3)) > 0) {
+ reversePitches = false;
+ switch (int(random(6))) {
+ case 0: pscale = diatonic; scaleStr = ", Diatonic"; break;
+ case 1: pscale = diatonic; scaleStr = ", Diatonic"; break;
+ case 2: pscale = blues; scaleStr = ", Blues 1"; break;
+ case 3: pscale = blues2; scaleStr = ", Blues 2"; break;
+ case 4: pscale = minor; scaleStr = ", Minor"; break;
+ case 5: pscale = minorh; scaleStr = ", Minor #7"; break;
+ }
+ lenScale = pscale.length;
+ lowestNoteNumber = int(72 - (nbrPoints*12/lenScale)/2);
+ }
+ titles[2] = "Hand-cranked, " + nbrPoints + " tines" + scaleStr;
+ kMidiChannel = (kMidiChannel + 1) % 5;
+}
+
+// int [] pscale = null;
+// int lenScale = 0;
+
+int pitchAssign(int i)
+{
+ if (pscale != null)
+ {
+ i = (pscale[i % lenScale] + 12*int(i/lenScale));
+ }
+ if (reversePitches)
+ return lowestNoteNumber+(nbrPoints-1)-i;
+ else
+ return lowestNoteNumber+i;
+}
+
+int velAssign(int i)
+{
+ return kDefaultVelocity;
+}
+
+long cMillis = 0;
+
+void draw()
+{
+ // long cMillis = millis();
+ long eMillis = millis();
+
+ if (eMillis - startOfVariation > kVariationLength) {
+ resetBox();
+ }
+
+ background(0);
+ image(bgImage, width/2, height/2);
+
+ if (eMillis - startOfVariation < 15000) {
+ float elapsed = (eMillis - startOfVariation)/1000.0;
+ float clr = elapsed < 5? elapsed/5 : elapsed > 10? 1-(elapsed-10)/5 : 1;
+ fill(clr);
+ stroke(clr);
+ int xo = (width-height)/2 + 30;
+ int yo = 30+22;
+ for (int i = 0; i < titles.length; ++i)
+ text(titles[i],xo,yo+32*i);
+ noFill();
+ }
+
+
+ // stroke(.2);
+ // line(cx,cy,width,cy); // delete this line of code to get of the graphical line
+
+ float mx = mouseX/(float)width;
+ float my = mouseY/(float)height;
+ float speed = (2*PI*nbrPoints) / cycleLength;
+
+
+
+
+ if (abs(angD) > 0.01) {
+ cMillis += (angD*100);
+ // crankMC._rotation += angD;
+ // crankMC.knob._rotation = -crankMC._rotation;
+ angD *= .92;
+ }
+ float timer = cMillis*.001*speed;
+
+
+
+ float pi2 = 2*PI;
+ noStroke();
+
+ for (int i = 0; i < nbrPoints; ++i)
+ {
+ float r = (i+1)/(float)nbrPoints;
+
+ float a = timer * r;
+ float len = circleRadius * (1 + 1.0 /nbrPoints - r);
+
+ if (floor(a/pi2) != floor(tines[i]/pi2))
+ {
+ // Sound Note Here...
+ if (!isMute) {
+ midiOutput.sendNoteOn(kMidiChannel, pitchAssign(i), velAssign(i));
+ isOn[i] = true;
+ }
+ lastSound[i] = eMillis;
+ }
+ else if (isOn[i] && eMillis - lastSound[i] > kNoteDuration)
+ {
+ midiOutput.sendNoteOff(kMidiChannel, pitchAssign(i), 0);
+ isOn[i] = false;
+ }
+
+ // swap sin & cos here if you want the notes to sound on the top or bottom, instead of left or right
+ // use -cos or -sin to flip the bar from right to left, or bottom to top
+
+ float x = (cx + cos(a)*len);
+ float y = (cy + sin(a)*len);
+ float minRad = 20-r*16;
+ float radv = max( (minRad+6)-6*(eMillis-lastSound[i])/500.0 , minRad);
+
+ float huev = r;
+ float satv = min(.5, (eMillis-lastSound[i])/1000.0);
+ float valv = 1;
+
+ fill(color(huev,satv,valv));
+ ellipse(x,y,radv,radv);
+
+ tines[i] = a;
+ }
+ timer -= speed;
+
+}
+
+void allNotesOff()
+{
+ for (int i = 0; i < 128; ++i)
+ midiOutput.sendNoteOff(kMidiChannel, i, 0);
+}
+
+void keyPressed() {
+ if (key == ' ')
+ {
+ isMute = !isMute;
+ if (isMute) {
+ allNotesOff();
+ }
+ println("MUTE " + (isMute? "ON" : "OFF"));
+ }
+ else if (key == 'r') {
+ resetBox();
+ }
+ else if (keyCode == LEFT || keyCode == UP)
+ angD -= .25;
+ else if (keyCode == RIGHT || keyCode == DOWN)
+ angD += .25;
+}
+
160 processing/plus_midi/whitney_music/whitney_music.pde
@@ -0,0 +1,160 @@
+// Whitney Music Box - a Processing + MIDI implementaton - 10/17/2008 Jim Bumgardner
+//
+// Inspired by the motion graphics of John Whitney
+// Music by Jim Bumgardner
+//
+// NOTE To use this, install rwMidi in your Processing Library, following the
+// instructions in this tutorial:
+//
+// http://www.vimeo.com/1824904?pg=embed&sec=1824904
+//
+// If you're on a Mac, you will also need to install OSXMidiSPim as described
+// in the video tutorial.
+//
+//
+// Press SPACE to for allNotesOff (mute)
+//
+// http://www.coverpop.com/whitney/
+
+import rwmidi.*;
+
+MidiOutput midiOutput;
+
+// Modify these to your taste...
+int nbrPoints = 48 ; // number of notes
+// int lowestNoteNumber = 72-nbrPoints/2; // lowest MIDI pitch
+int lowestNoteNumber = 67; // lowest MIDI pitch
+boolean reversePitches = false;
+float cycleLength = 1 * 60; // 3 Minute Cycle
+
+int kWidth = 500; // width of graphics
+int kHeight = 500; // height of graphics
+int kMidiChannel = 0;
+int kDefaultVelocity = 64;
+int kNoteDuration = 8000; // 8000
+int cx = kWidth/2,cy = kHeight/2; // center coordinates
+float circleRadius;
+float[] tines; // keeps track of current position of note, by angle
+long[] lastSound; // keeps track of time last note sounded
+boolean[] isOn;
+boolean isMute = false;
+
+void setup()
+{
+ size(kWidth, kHeight);
+ circleRadius = (min(width,height)/2) * 0.95;
+ noStroke();
+ smooth();
+ colorMode(HSB, 1);
+ background(0);
+
+ tines = new float[nbrPoints];
+ lastSound = new long[nbrPoints];
+ isOn = new boolean[nbrPoints];
+ for (int i = 0; i < nbrPoints; ++i)
+ {
+ tines[i] = -10;
+ lastSound[i] = millis();
+ isOn[i] = false;
+ }
+
+ // Show available MIDI output devices here
+ MidiOutputDevice devices[] = RWMidi.getOutputDevices();
+ for (int i = 0; i < devices.length; i++) {
+ println(i + ": " + devices[i].getName());
+ }
+ // Currently we assume the first device (#0) is the one we want
+ midiOutput = RWMidi.getOutputDevices()[0].createOutput();
+ println("\nPress SPACE to MUTE (all notes off)");
+}
+
+int pitchAssign(int i)
+{
+ if (reversePitches)
+ return lowestNoteNumber+(nbrPoints-1)-i;
+ else
+ return lowestNoteNumber+i;
+}
+
+int velAssign(int i)
+{
+ return kDefaultVelocity;
+}
+
+void draw()
+{
+ background(0);
+
+ stroke(.2);
+ line(cx,cy,width,cy); // delete this line of code to get of the graphical line
+
+ float mx = mouseX/(float)width;
+ float my = mouseY/(float)height;
+ float speed = (2*PI*nbrPoints) / cycleLength;
+
+ long cMillis = millis();
+ float timer = cMillis*.001*speed;
+
+ float pi2 = 2*PI;
+ noStroke();
+
+ for (int i = 0; i < nbrPoints; ++i)
+ {
+ float r = (i+1)/(float)nbrPoints;
+
+ float a = timer * r;
+ float len = circleRadius * (1 + 1.0 /nbrPoints - r);
+
+ if ((int) (a/pi2) != (int) (tines[i]/pi2))
+ {
+ // Sound Note Here...
+ if (!isMute) {
+ midiOutput.sendNoteOn(kMidiChannel, pitchAssign(i), velAssign(i));
+ isOn[i] = true;
+ }
+ lastSound[i] = millis();
+ }
+ else if (isOn[i] && millis() - lastSound[i] > kNoteDuration)
+ {
+ midiOutput.sendNoteOff(kMidiChannel, pitchAssign(i), 0);
+ isOn[i] = false;
+ }
+
+ // swap sin & cos here if you want the notes to sound on the top or bottom, instead of left or right
+ // use -cos or -sin to flip the bar from right to left, or bottom to top
+
+ float x = (cx + cos(a)*len);
+ float y = (cy + sin(a)*len);
+ float minRad = 20-r*16;
+ float radv = max( (minRad+6)-6*(cMillis-lastSound[i])/500.0 , minRad);
+
+ float huev = r;
+ float satv = min(.5, (cMillis-lastSound[i])/1000.0);
+ float valv = 1;
+
+ fill(color(huev,satv,valv));
+ ellipse(x,y,radv,radv);
+
+ tines[i] = a;
+ }
+ timer -= speed;
+
+}
+
+void allNotesOff()
+{
+ for (int i = 0; i < 128; ++i)
+ midiOutput.sendNoteOff(kMidiChannel, i, 0);
+}
+
+void keyPressed() {
+ if (key == ' ')
+ {
+ isMute = !isMute;
+ if (isMute) {
+ allNotesOff();
+ }
+ println("MUTE " + (isMute? "ON" : "OFF"));
+ }
+}
+
61 processing/plus_pd/pd_whitney_osc/data/makeorgan.pl
@@ -0,0 +1,61 @@
+#!/usr/local/bin/perl
+
+# script to make polyphonic organ patch - Jim Bumgardner
+#
+# V1.1 9-12-2011 Improved voice message passing.
+
+$nbrVoices = shift;
+$voiceName = shift;
+
+$nbrVoices = 24 if !$nbrVoices;
+$voiceName = 'voice~' if !$voiceName;
+$voiceWidth = 20;
+
+$routeList = join ' ', (0..$nbrVoices-1);
+
+$lm = 48; # left margin
+$cw = $nbrVoices * $voiceWidth + $lm*2; # canvas width
+$ch = 460; # canvas height
+$cx = int($cw/2); # canvas horizontal center
+$cy = int($ch/2); # vertical center (unused)
+
+$inletIdx = 1; # module indices
+$unpackIdx = 2;
+$modIdx = 3;
+$packIdx = 4;
+$mixIdx = 5;
+$routeIdx = 6;
+$outletIdx = 7;
+$firstVoiceIdx = 8;
+
+$mixDown = 1.0/$nbrVoices; # mix down ratio
+
+print <<EOT;
+#N canvas 100 100 $cw $ch 10;
+#X text 20 8 Created with makeorgan.pl;
+#X obj $cx 40 inlet;
+#X obj $cx 80 unpack f f f;
+#X obj $cx 120 mod $nbrVoices;
+#X obj $cx 160 pack f f f;
+#X obj $cx 360 *~ $mixDown;
+#X obj $cx 200 route $routeList;
+#X obj $cx 420 outlet~;
+EOT
+foreach my $i (0..$nbrVoices-1) {
+ printf "#X obj %d %d %s;\n", $i*$voiceWidth+$lm,260+sin($i*3.1415/$nbrVoices)*30,$voiceName;
+}
+print <<EOT;
+#X connect $inletIdx 0 $unpackIdx 0;
+#X connect $unpackIdx 0 $modIdx 0;
+#X connect $unpackIdx 1 $packIdx 1;
+#X connect $unpackIdx 2 $packIdx 2;
+#X connect $modIdx 0 $packIdx 0;
+#X connect $packIdx 0 $routeIdx 0;
+#X connect $mixIdx 0 $outletIdx 0;
+EOT
+foreach my $i (0..$nbrVoices-1) {
+ printf "#X connect %d %d %d %d;\n", $routeIdx, $i, $firstVoiceIdx+$i, 0;
+}
+foreach my $i (0..$nbrVoices-1) {
+ printf "#X connect %d %d %d %d;\n", $firstVoiceIdx+$i, 0, $mixIdx, 0;
+}
978 processing/plus_pd/pd_whitney_osc/data/organbell~.pd
@@ -0,0 +1,978 @@
+#N canvas 100 100 1376 460 10;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X text 20 8 Created with makeorgan.pl;
+#X obj 688 40 inlet;
+#X obj 688 80 unpack f f f;
+#X obj 688 120 mod 64;
+#X obj 688 160 pack f f f;
+#X obj 688 200 route 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
+19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
+42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63;
+#X obj 688 420 outlet~;
+#X obj 48 260 rissetbell~;
+#X obj 68 261 rissetbell~;
+#X obj 88 262 rissetbell~;
+#X obj 108 264 rissetbell~;
+#X obj 128 265 rissetbell~;
+#X obj 148 267 rissetbell~;
+#X obj 168 268 rissetbell~;
+#X obj 188 270 rissetbell~;
+#X obj 208 271 rissetbell~;
+#X obj 228 272 rissetbell~;
+#X obj 248 274 rissetbell~;
+#X obj 268 275 rissetbell~;
+#X obj 288 276 rissetbell~;
+#X obj 308 277 rissetbell~;
+#X obj 328 279 rissetbell~;
+#X obj 348 280 rissetbell~;
+#X obj 368 281 rissetbell~;
+#X obj 388 282 rissetbell~;
+#X obj 408 283 rissetbell~;
+#X obj 428 284 rissetbell~;
+#X obj 448 284 rissetbell~;
+#X obj 468 285 rissetbell~;
+#X obj 488 286 rissetbell~;
+#X obj 508 287 rissetbell~;
+#X obj 528 287 rissetbell~;
+#X obj 548 288 rissetbell~;
+#X obj 568 288 rissetbell~;
+#X obj 588 289 rissetbell~;
+#X obj 608 289 rissetbell~;
+#X obj 628 289 rissetbell~;
+#X obj 648 289 rissetbell~;
+#X obj 668 289 rissetbell~;
+#X obj 688 289 rissetbell~;
+#X obj 708 289 rissetbell~;
+#X obj 728 289 rissetbell~;
+#X obj 748 289 rissetbell~;
+#X obj 768 289 rissetbell~;
+#X obj 788 289 rissetbell~;
+#X obj 808 288 rissetbell~;
+#X obj 828 288 rissetbell~;
+#X obj 848 287 rissetbell~;
+#X obj 868 287 rissetbell~;
+#X obj 888 286 rissetbell~;
+#X obj 908 285 rissetbell~;
+#X obj 928 284 rissetbell~;
+#X obj 948 284 rissetbell~;
+#X obj 968 283 rissetbell~;
+#X obj 988 282 rissetbell~;
+#X obj 1008 281 rissetbell~;
+#X obj 1028 280 rissetbell~;
+#X obj 1048 279 rissetbell~;
+#X obj 1068 277 rissetbell~;
+#X obj 1088 276 rissetbell~;
+#X obj 1108 275 rissetbell~;
+#X obj 1128 274 rissetbell~;
+#X obj 1148 272 rissetbell~;
+#X obj 1168 271 rissetbell~;
+#X obj 1188 270 rissetbell~;
+#X obj 1208 268 rissetbell~;
+#X obj 1228 267 rissetbell~;
+#X obj 1248 265 rissetbell~;
+#X obj 1268 264 rissetbell~;
+#X obj 1288 262 rissetbell~;
+#X obj 1308 261 rissetbell~;
+#X obj 689 360 *~ 0.1;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 2 1 4 1;
+#X connect 2 2 4 2;
+#X connect 3 0 4 0;
+#X connect 4 0 5 0;
+#X connect 5 0 7 0;
+#X connect 5 1 8 0;
+#X connect 5 2 9 0;
+#X connect 5 3 10 0;
+#X connect 5 4 11 0;
+#X connect 5 5 12 0;
+#X connect 5 6 13 0;
+#X connect 5 7 14 0;
+#X connect 5 8 15 0;
+#X connect 5 9 16 0;
+#X connect 5 10 17 0;
+#X connect 5 11 18 0;
+#X connect 5 12 19 0;
+#X connect 5 13 20 0;
+#X connect 5 14 21 0;
+#X connect 5 15 22 0;
+#X connect 5 16 23 0;
+#X connect 5 17 24 0;
+#X connect 5 18 25 0;
+#X connect 5 19 26 0;
+#X connect 5 20 27 0;
+#X connect 5 21 28 0;
+#X connect 5 22 29 0;
+#X connect 5 23 30 0;
+#X connect 5 24 31 0;
+#X connect 5 25 32 0;
+#X connect 5 26 33 0;
+#X connect 5 27 34 0;
+#X connect 5 28 35 0;
+#X connect 5 29 36 0;
+#X connect 5 30 37 0;
+#X connect 5 31 38 0;
+#X connect 5 32 39 0;
+#X connect 5 33 40 0;
+#X connect 5 34 41 0;
+#X connect 5 35 42 0;
+#X connect 5 36 43 0;
+#X connect 5 37 44 0;
+#X connect 5 38 45 0;
+#X connect 5 39 46 0;
+#X connect 5 40 47 0;
+#X connect 5 41 48 0;
+#X connect 5 42 49 0;
+#X connect 5 43 50 0;
+#X connect 5 44 51 0;
+#X connect 5 45 52 0;
+#X connect 5 46 53 0;
+#X connect 5 47 54 0;
+#X connect 5 48 55 0;
+#X connect 5 49 56 0;
+#X connect 5 50 57 0;
+#X connect 5 51 58 0;
+#X connect 5 52 59 0;
+#X connect 5 53 60 0;
+#X connect 5 54 61 0;
+#X connect 5 55 62 0;
+#X connect 5 56 63 0;
+#X connect 5 57 64 0;
+#X connect 5 58 65 0;
+#X connect 5 59 66 0;
+#X connect 5 60 67 0;
+#X connect 5 61 68 0;
+#X connect 5 62 69 0;
+#X connect 5 63 70 0;
+#X connect 7 0 71 0;
+#X connect 8 0 71 0;
+#X connect 9 0 71 0;
+#X connect 10 0 71 0;
+#X connect 11 0 71 0;
+#X connect 12 0 71 0;
+#X connect 13 0 71 0;
+#X connect 14 0 71 0;
+#X connect 15 0 71 0;
+#X connect 16 0 71 0;
+#X connect 17 0 71 0;
+#X connect 18 0 71 0;
+#X connect 19 0 71 0;
+#X connect 20 0 71 0;
+#X connect 21 0 71 0;
+#X connect 22 0 71 0;
+#X connect 23 0 71 0;
+#X connect 24 0 71 0;
+#X connect 25 0 71 0;
+#X connect 26 0 71 0;
+#X connect 27 0 71 0;
+#X connect 28 0 71 0;
+#X connect 29 0 71 0;
+#X connect 30 0 71 0;
+#X connect 31 0 71 0;
+#X connect 32 0 71 0;
+#X connect 33 0 71 0;
+#X connect 34 0 71 0;
+#X connect 35 0 71 0;
+#X connect 36 0 71 0;
+#X connect 37 0 71 0;
+#X connect 38 0 71 0;
+#X connect 39 0 71 0;
+#X connect 40 0 71 0;
+#X connect 41 0 71 0;
+#X connect 42 0 71 0;
+#X connect 43 0 71 0;
+#X connect 44 0 71 0;
+#X connect 45 0 71 0;
+#X connect 46 0 71 0;
+#X connect 47 0 71 0;
+#X connect 48 0 71 0;
+#X connect 49 0 71 0;
+#X connect 50 0 71 0;
+#X connect 51 0 71 0;
+#X connect 52 0 71 0;
+#X connect 53 0 71 0;
+#X connect 54 0 71 0;
+#X connect 55 0 71 0;
+#X connect 56 0 71 0;
+#X connect 57 0 71 0;
+#X connect 58 0 71 0;
+#X connect 59 0 71 0;
+#X connect 60 0 71 0;
+#X connect 61 0 71 0;
+#X connect 62 0 71 0;
+#X connect 63 0 71 0;
+#X connect 64 0 71 0;
+#X connect 65 0 71 0;
+#X connect 66 0 71 0;
+#X connect 67 0 71 0;
+#X connect 68 0 71 0;
+#X connect 69 0 71 0;
+#X connect 70 0 71 0;
+#X connect 71 0 6 0;
16 processing/plus_pd/pd_whitney_osc/data/organplayer.pd
@@ -0,0 +1,16 @@
+#N canvas 63 348 344 261 10;
+#X obj 59 43 dac~;
+#X obj 90 -41 rev3~ 100 92 3000 40;
+#X obj 39 -9 +~;
+#X obj 78 -7 +~;
+#X obj 78 -143 r tinehit;
+#X obj 78 -97 organ~;
+#X connect 1 0 2 1;
+#X connect 1 1 3 1;
+#X connect 2 0 0 0;
+#X connect 3 0 0 1;
+#X connect 4 0 5 0;
+#X connect 5 0 2 0;
+#X connect 5 0 3 0;
+#X connect 5 0 1 0;
+#X connect 5 0 1 1;
108 processing/plus_pd/pd_whitney_osc/data/organplayerbells.pd
@@ -0,0 +1,108 @@
+#N canvas 41 90 344 261 10;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;
+#X declare -path utils;