{
   "author" : "Henk Lasschuit",
   "name" : "Series of numbers",
   "description" : "In his book \"Schema's voor programmeren\" (Diagrams for programming, Kluwer, Deventer, 1988) Andree Hollander introduces a simple algorithm for generating a series of numbers: pick a number, if it is even, divide by 2, else multiply by 3 and add 1. Repeat until the value 1 is reached (or else 4,2,1,4,2,1 will be repeated endlessly). Use the numbers as sound parameters and you have, well, music!\r\nI generated 100 series, starting with 1 to 100. Of the sound in the middle the pitch is controlled by the numbers within a series and the timbre by the starting number. The sound in the left channel is the length of a series (pitch) and the longest series up until now determines the timbre. The sound in the right channel is controlled by the maximum value within a series and the highest value up until now determines the timbre.",
   "ancestor_list" : [],
   "labels" : [
      "series of numbers"
   ],
   "id" : "1-2PM",
   "is_private" : null,
   "code" : "//series of numbers\r\nServer.default.boot;\r\n(\r\nSynthDef(\\beep, { |freq=440, cutoff=1000, pan=0|\r\n\tOut.ar(0, Pan2.ar(LPF.ar(Saw.ar(freq), cutoff), pan)) }).send(s);\r\n)\r\n\r\n//from 1 to 100\r\n//while number>1\r\n//if even: divide by 2, else multiply by 3 and add 1 \r\n//remember highest value, remember longest series, both with their startnumber\r\n//startnumber->cutoff, number-> frequency, pan mid\r\n//startnumber->cutoff, highest value -> frequency, pan right\r\n//startnumber->cutoff, longest series -> cutoff, pan left\r\n(\r\nvar highest=1,  longest=1, starthighest=1, startlongest=1;\r\nvar numberbeep, highestbeep, longestbeep;\r\nnumberbeep=Synth(\\beep, [\\freq, 200, \\cutoff, 200, \\pan, 0]);\r\nlongestbeep=Synth(\\beep, [\\freq, 200, \\cutoff, 200, \\pan, -1]);\r\nhighestbeep=Synth(\\beep, [\\freq, 200, \\cutoff, 200, \\pan, 1]);\r\nRoutine({\r\n\tfor (1, 100, { arg startnumber;\r\n\t\tvar number, length=1, maximum;\r\n\t\tnumber=startnumber;\r\n\t\tmaximum=startnumber;\r\n\t\t(number.asString+\" \").post;\r\n\t\tnumberbeep.set(\\cutoff, 100*startnumber);\r\n\t\twhile ( {number>1},{\r\n\t\t\tif (number.asInteger.even, {number=(number/2)}, {number=3*number+1});\r\n\t\t\tlength=length+1;\r\n\t\t\tif (number>maximum, {maximum=number});\r\n\t\t\tnumberbeep.set(\\freq, 30+number);\r\n\t\t\tlongestbeep.set(\\freq, 75*length);\r\n\t\t\thighestbeep.set(\\freq, 30+maximum);\r\n\t\t\t0.1.wait;\r\n\t\t});\r\n\t\tif(length>longest, {longest=length; startlongest=startnumber});\r\n\t\tif (maximum>highest, {highest=maximum; starthighest=startnumber});\r\n\t\tlongestbeep.set(\\cutoff, 100*longest);\r\n\t\thighestbeep.set(\\cutoff, highest*2);\r\n\t\t\t(\"length: \"+length.asString).post;\r\n\t\t\t(\" maximum: \" + maximum.asString).postln;\r\n\t});\r\n\tpostf(\"longest series % at % \\n\", longest, startlongest);\r\n\tpostf(\"highest value % at % \\n\", highest, starthighest);\r\n\tnumberbeep.set(\\freq, 30, \\cutoff, 10000);\r\n\tlongestbeep.set(\\freq, 75*longest, \\cutoff, 100*startlongest);\r\n\thighestbeep.set(\\freq, 30+highest, \\cutoff, 100*starthighest);\r\n\t10.wait;\t\t\r\n\tnumberbeep.free;\r\n\thighestbeep.free;\r\n\tlongestbeep.free;\r\n}).play;\r\n)"
}
