{
   "labels" : [
      "markov chain",
      "euclidean",
      "permutations",
      "partitions"
   ],
   "code" : "/*\r\n *                            COPYRIGHT\r\n *\r\n *  markovgen.c\r\n *  Copyright (C) 2014 Exstrom Laboratories LLC\r\n *\r\n *  This program is free software; you can redistribute it and/or modify\r\n *  it under the terms of the GNU General Public License as published by\r\n *  the Free Software Foundation; either version 2 of the License, or\r\n *  (at your option) any later version.\r\n *\r\n *  This program is distributed in the hope that it will be useful,\r\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n *  GNU General Public License for more details.\r\n *\r\n *  A copy of the GNU General Public License is available on the internet at:\r\n *  http://www.gnu.org/copyleft/gpl.html\r\n *\r\n *  or you can write to:\r\n *\r\n *  The Free Software Foundation, Inc.\r\n *  675 Mass Ave\r\n *  Cambridge, MA 02139, USA\r\n *\r\n *  Exstrom Laboratories LLC contact:\r\n *  stefan(AT)exstrom.com\r\n *\r\n *  Exstrom Laboratories LLC\r\n *  Longmont, CO 80503, USA\r\n *\r\n */\r\n\r\n//ported to supercollider oct2017\r\n\r\n\r\n//------------------------------------------------------------------------\r\n// comp\r\n// generates all compositions of n\r\n//------------------------------------------------------------------------\r\n(\r\n~comp= {|n|\r\n\tvar res= List.new;\r\n\tvar parts= Array.newClear(n-1);\r\n\tvar compose= {|n, p, m|\r\n\t\tif(n==0, {\r\n\t\t\tres.add(parts.copyRange(0, m-1)++p);\r\n\t\t}, {\r\n\t\t\tparts[m]= p;\r\n\t\t\tcompose.(n-1, 1, m+1);\r\n\t\t\tcompose.(n-1, p+1, m);\r\n\t\t});\r\n\t};\r\n\tcompose.(n-1, 1, 0);\r\n\tres;\r\n};\r\n)\r\n\r\n~comp.(4).do{|x| x.postln};\r\n~comp.(5).do{|x| x.postln};\r\n~comp.(6).do{|x| x.postln};\r\n~comp.(7).do{|x| x.postln};\r\n\r\n\r\n//------------------------------------------------------------------------\r\n// compm\r\n// generates all compositions of n into m parts\r\n//------------------------------------------------------------------------\r\n(\r\n~compm= {|n, m|\r\n\tvar res= List.new;\r\n\tvar parts= Array.newClear(n-1);\r\n\tvar mp= m-1;\r\n\tvar compose= {|n, p, m|\r\n\t\tif(n==0, {\r\n\t\t\tif(m==mp, {\r\n\t\t\t\tres.add(parts.copyRange(0, m-1)++p);\r\n\t\t\t});\r\n\t\t}, {\r\n\t\t\tif(m<mp, {\r\n\t\t\t\tparts[m]= p;\r\n\t\t\t\tcompose.(n-1, 1, m+1);\r\n\t\t\t});\r\n\t\t\tcompose.(n-1, p+1, m);\r\n\t\t});\r\n\t};\r\n\tcompose.(n-1, 1, 0);\r\n\tres;\r\n};\r\n)\r\n\r\n~compm.(4, 3).do{|x| x.postln};\r\n~compm.(5, 3).do{|x| x.postln};\r\n~compm.(6, 3).do{|x| x.postln};\r\n~compm.(7, 3).do{|x| x.postln};\r\n\r\n\r\n//------------------------------------------------------------------------\r\n// compa\r\n// generates compositions of n with allowed parts pi\r\n//------------------------------------------------------------------------\r\n(\r\n~compa= {|n ...p|\r\n\tvar res= List.new;\r\n\tvar parts= Array.newClear(n-1);\r\n\tvar aparts= p;\r\n\tvar allowed= {|p| aparts.includes(p)};\r\n\tvar compose= {|n, p, m|\r\n\t\tif(n==0, {\r\n\t\t\tif(allowed.(p), {\r\n\t\t\t\tres.add(parts.copyRange(0, m-1)++p);\r\n\t\t\t});\r\n\t\t}, {\r\n\t\t\tif(allowed.(p), {\r\n\t\t\t\tparts[m]= p;\r\n\t\t\t\tcompose.(n-1, 1, m+1);\r\n\t\t\t});\r\n\t\t\tcompose.(n-1, p+1, m);\r\n\t\t});\r\n\t};\r\n\tcompose.(n-1, 1, 0);\r\n\tres;\r\n};\r\n)\r\n\r\n~compa.(8, 3, 4, 5, 6).do{|x| x.postln};\r\n~compa.(8, 2, 4, 5, 6).do{|x| x.postln};\r\n~compa.(8, 1, 4, 5, 6).do{|x| x.postln};\r\n\r\n\r\n//------------------------------------------------------------------------\r\n// compam\r\n// generates compositions of n with m parts from the set (p1 p2 ...)\r\n//------------------------------------------------------------------------\r\n(\r\n~compam= {|n, m ...p|\r\n\tvar res= List.new;\r\n\tvar parts= Array.newClear(n-1);\r\n\tvar mp= m-1;\r\n\tvar aparts= p;\r\n\tvar allowed= {|p| aparts.includes(p)};\r\n\tvar compose= {|n, p, m|\r\n\t\tif(n==0, {\r\n\t\t\tif(m==mp and:{allowed.(p)}, {\r\n\t\t\t\tres.add(parts.copyRange(0, m-1)++p);\r\n\t\t\t});\r\n\t\t}, {\r\n\t\t\tif(m<mp and:{allowed.(p)}, {\r\n\t\t\t\tparts[m]= p;\r\n\t\t\t\tcompose.(n-1, 1, m+1);\r\n\t\t\t});\r\n\t\t\tcompose.(n-1, p+1, m);\r\n\t\t});\r\n\t};\r\n\tcompose.(n-1, 1, 0);\r\n\tres;\r\n};\r\n)\r\n\r\n~compam.(16, 5, 2, 3, 4).do{|x| x.postln};\r\n~compam.(16, 5, 1, 2, 3, 4).do{|x| x.postln};\r\n~compam.(16, 5, 1, 2, 3, 4, 5).do{|x| x.postln};\r\n\r\n\r\n//------------------------------------------------------------------------\r\n// comprnd\r\n// generate random composition of n\r\n//------------------------------------------------------------------------\r\n(\r\n~comprnd= {|n|\r\n\tvar res= List.new;\r\n\tvar p= 1;\r\n\t(n-1).do{\r\n\t\tif(0.5.coin, {\r\n\t\t\tp= p+1;\r\n\t\t}, {\r\n\t\t\tres.add(p);\r\n\t\t\tp= 1;\r\n\t\t});\r\n\t};\r\n\tres.add(p);\r\n\tres;\r\n};\r\n)\r\n\r\n~comprnd.(3).do{|x| x.postln};\r\n~comprnd.(4).do{|x| x.postln};\r\n~comprnd.(8).do{|x| x.postln};\r\n\r\n\r\n//------------------------------------------------------------------------\r\n// compmrnd\r\n// generate random composition of n into m parts\r\n//------------------------------------------------------------------------\r\n(\r\n~compmrnd= {|n, m|\r\n\tvar res= List.new;\r\n\tvar mp= m-1;\r\n\tvar np= n-1;\r\n\tvar p;\r\n\tvar j= 1;\r\n\twhile({mp>0}, {\r\n\t\tp= mp*(1/np);\r\n\t\tif(1.0.rand<p, {\r\n\t\t\tres.add(j);\r\n\t\t\tmp= mp-1;\r\n\t\t\tj= 1;\r\n\t\t}, {\r\n\t\t\tj= j+1;\r\n\t\t});\r\n\t\tnp= np-1;\r\n\t});\r\n\tres.add(j+np);\r\n\tres;\r\n};\r\n)\r\n\r\n~compmrnd.(3, 2).do{|x| x.postln};\r\n~compmrnd.(4, 2).do{|x| x.postln};\r\n~compmrnd.(8, 2).do{|x| x.postln};\r\n~compmrnd.(8, 4).do{|x| x.postln};\r\n\r\n\r\n//------------------------------------------------------------------------\r\n// neck\r\n// generates all binary necklaces of length n\r\n//------------------------------------------------------------------------\r\n(\r\n~neck= {|n|\r\n\tvar res= List.new;\r\n\tvar b= Array.newClear(n+1);\r\n\tvar neckbin= {|k, l|\r\n\t\tif(k>n, {\r\n\t\t\tif((n%l)==0, {\r\n\t\t\t\tres.add(b.copyRange(1, n));\r\n\t\t\t});\r\n\t\t}, {\r\n\t\t\tb[k]= b[k-l];\r\n\t\t\tif(b[k]==1, {\r\n\t\t\t\tneckbin.(k+1, l);\r\n\t\t\t\tb[k]= 0;\r\n\t\t\t\tneckbin.(k+1, k);\r\n\t\t\t}, {\r\n\t\t\t\tneckbin.(k+1, l);\r\n\t\t\t});\r\n\t\t});\r\n\t};\r\n\tb[0]= 1;\r\n\tneckbin.(1, 1);\r\n\tres;\r\n};\r\n)\r\n\r\n~neck.(4).do{|x| x.postln};\r\n~neck.(5).do{|x| x.postln};\r\n~neck.(6).do{|x| x.postln};\r\n\r\n\r\n//------------------------------------------------------------------------\r\n// neckm\r\n// generates all binary necklaces of length n with m ones\r\n//------------------------------------------------------------------------\r\n(\r\n~neckm= {|n, n1|\r\n\tvar res= List.new;\r\n\tvar b= Array.newClear(n+1);\r\n\tvar neckbin= {|k, l, m|\r\n\t\tif(k>n, {\r\n\t\t\tif((n%l)==0 and:{m==n1}, {\r\n\t\t\t\tres.add(b.copyRange(1, n));\r\n\t\t\t});\r\n\t\t}, {\r\n\t\t\tb[k]= b[k-l];\r\n\t\t\tif(b[k]==1, {\r\n\t\t\t\tneckbin.(k+1, l, m+1);\r\n\t\t\t\tb[k]= 0;\r\n\t\t\t\tneckbin.(k+1, k, m);\r\n\t\t\t}, {\r\n\t\t\t\tneckbin.(k+1, l, m);\r\n\t\t\t});\r\n\t\t});\r\n\t};\r\n\tb[0]= 1;\r\n\tneckbin.(1, 1, 0);\r\n\tres;\r\n};\r\n)\r\n\r\n~neckm.(4, 2).do{|x| x.postln};\r\n~neckm.(8, 2).do{|x| x.postln};\r\n~neckm.(8, 4).do{|x| x.postln};\r\n\r\n\r\n//------------------------------------------------------------------------\r\n// necka\r\n// generates binary necklaces of length n with allowed parts pi\r\n//------------------------------------------------------------------------\r\n(\r\n~necka= {|n ...p|\r\n\tvar res= List.new;\r\n\tvar b= Array.newClear(n+1);\r\n\tvar aparts= p;\r\n\tvar allowed= {|p| aparts.includes(p)};\r\n\tvar neckbin= {|k, l, p|\r\n\t\tif(k>n, {\r\n\t\t\tif((n%l)==0 and:{allowed.(p) and:{p<=n}}, {\r\n\t\t\t\tres.add(b.copyRange(1, n));\r\n\t\t\t});\r\n\t\t}, {\r\n\t\t\tb[k]= b[k-l];\r\n\t\t\tif(b[k]==1, {\r\n\t\t\t\tif(allowed.(p) or:{k==1}, {neckbin.(k+1, l, 1)});\r\n\t\t\t\tb[k]= 0;\r\n\t\t\t\tneckbin.(k+1, k, p+1);\r\n\t\t\t}, {\r\n\t\t\t\tneckbin.(k+1, l, p+1);\r\n\t\t\t});\r\n\t\t});\r\n\t};\r\n\tb[0]= 1;\r\n\tneckbin.(1, 1, 1);\r\n\tres;\r\n};\r\n)\r\n\r\n~necka.(4, 2, 3, 4).do{|x| x.postln};\r\n~necka.(8, 2, 3, 4).do{|x| x.postln};\r\n~necka.(8, 4, 1).do{|x| x.postln};\r\n\r\n\r\n//------------------------------------------------------------------------\r\n// neckam\r\n// generates binary necklaces of length n with m ones and allowed parts pi\r\n//------------------------------------------------------------------------\r\n(\r\n~neckam= {|n, n1 ...p|\r\n\tvar res= List.new;\r\n\tvar b= Array.newClear(n+1);\r\n\tvar aparts= p;\r\n\tvar allowed= {|p| aparts.includes(p)};\r\n\tvar neckbin= {|k, l, m, p|\r\n\t\tif(k>n, {\r\n\t\t\tif((n%l)==0 and:{allowed.(p) and:{p<=n and:{m==n1}}}, {\r\n\t\t\t\tres.add(b.copyRange(1, n));\r\n\t\t\t});\r\n\t\t}, {\r\n\t\t\tb[k]= b[k-l];\r\n\t\t\tif(b[k]==1, {\r\n\t\t\t\tif(allowed.(p) or:{k==1}, {neckbin.(k+1, l, m+1, 1)});\r\n\t\t\t\tb[k]= 0;\r\n\t\t\t\tneckbin.(k+1, k, m, p+1);\r\n\t\t\t}, {\r\n\t\t\t\tneckbin.(k+1, l, m, p+1);\r\n\t\t\t});\r\n\t\t});\r\n\t};\r\n\tb[0]= 1;\r\n\tneckbin.(1, 1, 0, 1);\r\n\tres;\r\n};\r\n)\r\n\r\n~neckam.(8, 4, 1, 3).do{|x| x.postln};\r\n~neckam.(16, 5, 2, 3, 4).do{|x| x.postln};\r\n\r\n\r\n//------------------------------------------------------------------------\r\n// part\r\n// generates all partitions of n\r\n//------------------------------------------------------------------------\r\n(\r\n~part= {|n|\r\n\tvar res= List.new;\r\n\tvar parts= Array.newClear(n-1);\r\n\tvar partitions= {|n, p, m|\r\n\t\tif(n==0, {\r\n\t\t\tres.add(parts.copyRange(0, m-1)++p);\r\n\t\t}, {\r\n\t\t\tif(n>0, {\r\n\t\t\t\tparts[m]= p;\r\n\t\t\t\tpartitions.(n-p, p, m+1);\r\n\t\t\t\tpartitions.(n-1, p+1, m);\r\n\t\t\t});\r\n\t\t});\r\n\t};\r\n\tpartitions.(n-1, 1, 0);\r\n\tres;\r\n};\r\n)\r\n\r\n~part.(4).do{|x| x.postln};\r\n~part.(5).do{|x| x.postln};\r\n~part.(6).do{|x| x.postln};\r\n\r\n\r\n//------------------------------------------------------------------------\r\n// partm\r\n// generates all partitions of n into m parts\r\n//------------------------------------------------------------------------\r\n(\r\n~partm= {|n, m|\r\n\tvar res= List.new;\r\n\tvar parts= Array.newClear(n-1);\r\n\tvar mp= m-1;\r\n\tvar partitions= {|n, p, m|\r\n\t\tif(n==0, {\r\n\t\t\tif(m==mp, {\r\n\t\t\t\tres.add(parts.copyRange(0, m-1)++p);\r\n\t\t\t});\r\n\t\t}, {\r\n\t\t\tif(n>0, {\r\n\t\t\t\tif(m<mp, {\r\n\t\t\t\t\tparts[m]= p;\r\n\t\t\t\t\tpartitions.(n-p, p, m+1);\r\n\t\t\t\t});\r\n\t\t\t\tpartitions.(n-1, p+1, m);\r\n\t\t\t});\r\n\t\t});\r\n\t};\r\n\tpartitions.(n-1, 1, 0);\r\n\tres;\r\n};\r\n)\r\n\r\n~partm.(4, 3).do{|x| x.postln};\r\n~partm.(4, 2).do{|x| x.postln};\r\n\r\n\r\n//------------------------------------------------------------------------\r\n// parta\r\n// generates all partitions of n with allowed parts pi\r\n//------------------------------------------------------------------------\r\n(\r\n~parta= {|n ...p|\r\n\tvar res= List.new;\r\n\tvar parts= Array.newClear(n-1);\r\n\tvar aparts= p;\r\n\tvar allowed= {|p| aparts.includes(p)};\r\n\tvar partitions= {|n, p, m|\r\n\t\tif(n==0, {\r\n\t\t\tif(allowed.(p), {\r\n\t\t\t\tres.add(parts.copyRange(0, m-1)++p);\r\n\t\t\t});\r\n\t\t}, {\r\n\t\t\tif(n>0, {\r\n\t\t\t\tif(allowed.(p), {\r\n\t\t\t\t\tparts[m]= p;\r\n\t\t\t\t\tpartitions.(n-p, p, m+1);\r\n\t\t\t\t});\r\n\t\t\t\tpartitions.(n-1, p+1, m);\r\n\t\t\t});\r\n\t\t});\r\n\t};\r\n\tpartitions.(n-1, 1, 0);\r\n\tres;\r\n};\r\n)\r\n\r\n~parta.(8, 2, 3).do{|x| x.postln};\r\n~parta.(8, 1, 4).do{|x| x.postln};\r\n\r\n\r\n//------------------------------------------------------------------------\r\n// partam\r\n// generates all partitions of n with m parts from the set (p1 p2 ...)\r\n//------------------------------------------------------------------------\r\n(\r\n~partam= {|n, m ...p|\r\n\tvar res= List.new;\r\n\tvar parts= Array.newClear(n-1);\r\n\tvar mp= m-1;\r\n\tvar aparts= p;\r\n\tvar allowed= {|p| aparts.includes(p)};\r\n\tvar partitions= {|n, p, m|\r\n\t\tif(n==0, {\r\n\t\t\tif(m==mp and:{allowed.(p)}, {\r\n\t\t\t\tres.add(parts.copyRange(0, m-1)++p);\r\n\t\t\t});\r\n\t\t}, {\r\n\t\t\tif(n>0, {\r\n\t\t\t\tif(m<mp and:{allowed.(p)}, {\r\n\t\t\t\t\tparts[m]= p;\r\n\t\t\t\t\tpartitions.(n-p, p, m+1);\r\n\t\t\t\t});\r\n\t\t\t\tpartitions.(n-1, p+1, m);\r\n\t\t\t});\r\n\t\t});\r\n\t};\r\n\tpartitions.(n-1, 1, 0);\r\n\tres;\r\n};\r\n)\r\n\r\n~partam.(16, 5, 1, 2, 3, 4, 5).do{|x| x.postln};\r\n\r\n\r\n//------------------------------------------------------------------------\r\n// permi\r\n// generates permutations of the integers ai>=0\r\n// to generate all permutations they must be ordered a1<a2<...<an\r\n// any other order will only generate permutations that are larger\r\n// in lexicographic order\r\n//------------------------------------------------------------------------\r\n(\r\n~permi= {|...a|\r\n\tvar res= List.new;\r\n\tvar n= a.size, i, j, m;\r\n\tvar running= true;\r\n\ta= [-1]++a;\r\n\twhile({running}, {\r\n\t\tres.add(a.copyRange(1, n));\r\n\t\ti= n-1;\r\n\t\twhile({i>0 and:{a[i]>=a[i+1]}}, {\r\n\t\t\ti= i-1;\r\n\t\t});\r\n\t\tif(i==0, {\r\n\t\t\trunning= false;\r\n\t\t}, {\r\n\t\t\tj= n;\r\n\t\t\twhile({a[i]>=a[j]}, {\r\n\t\t\t\tj= j-1;\r\n\t\t\t});\r\n\t\t\tm= a[j];\r\n\t\t\ta[j]= a[i];\r\n\t\t\ta[i]= m;\r\n\t\t\tj= i+1;\r\n\t\t\tk= n;\r\n\t\t\twhile({j<k}, {\r\n\t\t\t\tm= a[j];\r\n\t\t\t\ta[j]= a[k];\r\n\t\t\t\ta[k]= m;\r\n\t\t\t\tj= j+1;\r\n\t\t\t\tk= k-1;\r\n\t\t\t});\r\n\t\t});\r\n\t});\r\n\tres;\r\n};\r\n)\r\n\r\n~permi.(1, 2, 3).do{|x| x.postln};\r\n\r\n\r\n//------------------------------------------------------------------------\r\n// debruijn\r\n// generates the largest de Bruijn sequence of order n\r\n//------------------------------------------------------------------------\r\n(\r\n~debruijn= {|n|\r\n\tvar ndbs= 1<<n;\r\n\tvar idbs= 0;\r\n\tvar dbs;\r\n\tvar b= Array.newClear(n+1);\r\n\tvar neckbin= {|k, l|\r\n\t\tif(k>n, {\r\n\t\t\tif((n%l)==0, {\r\n\t\t\t\tl.do{|k|\r\n\t\t\t\t\tdbs[idbs+k]= if(b[k+1]==0, {0}, {1});\r\n\t\t\t\t};\r\n\t\t\t\tidbs= idbs+l;\r\n\t\t\t});\r\n\t\t}, {\r\n\t\t\tb[k]= b[k-l];\r\n\t\t\tif(b[k]==1, {\r\n\t\t\t\tneckbin.(k+1, l);\r\n\t\t\t\tb[k]= 0;\r\n\t\t\t\tneckbin.(k+1, k);\r\n\t\t\t}, {\r\n\t\t\t\tneckbin.(k+1, l);\r\n\t\t\t});\r\n\t\t});\r\n\t};\r\n\tb[0]= 1;\r\n\tdbs= Array.newClear(ndbs);\r\n\tneckbin.(1, 1);\r\n\tdbs;\r\n};\r\n)\r\n\r\n~debruijn.(3).do{|x| x.postln};\r\n~debruijn.(4).do{|x| x.postln};\r\n\r\n\r\n//------------------------------------------------------------------------\r\n// b2int\r\n// reads binary strings and converts them to interval notation\r\n//------------------------------------------------------------------------\r\n(\r\n~b2int= {|line|\r\n\tvar res= List.new;\r\n\tvar nbit= line.size;\r\n\tvar k, j= 0;\r\n\twhile({j<nbit}, {\r\n\t\tk= 1;\r\n\t\twhile({line[j= j+1]!=$1 and:{j<nbit}}, {\r\n\t\t\tk= k+1;\r\n\t\t});\r\n\t\tres.add(k);\r\n\t});\r\n\tres;\r\n};\r\n)\r\n\r\n~b2int.(\"1010010001001000\");\r\n\r\n\r\n//------------------------------------------------------------------------\r\n// int2b\r\n// reads intervals and converts them to a binary string\r\n//------------------------------------------------------------------------\r\n(\r\n~int2b= {|line|\r\n\tvar res= \"\";\r\n\tline.do{|k|\r\n\t\tres= res++$1;\r\n\t\t(k-1).do{res= res++$0};\r\n\t};\r\n\tres;\r\n};\r\n)\r\n\r\n~int2b.([2, 3, 4, 3, 4]);\r\n\r\n\r\n//------------------------------------------------------------------------\r\n// chsequl\r\n// generates the upper or lower Christoffel word for p/q\r\n//   t= type of word (\\upper or \\lower)\r\n//   p= numerator\r\n//   q= denominator\r\n//   n= number of terms to generate, default= p+q\r\n//------------------------------------------------------------------------\r\n(\r\n~chsequl= {|t, p, q, n|\r\n\tvar res= List.new;\r\n\tvar i= 0, a, b;\r\n\tn= n??{p+q};\r\n\twhile({\r\n\t\tres.add(if(t==\\upper, 1, 0));\r\n\t\ti= i+1;\r\n\t\ta= p;\r\n\t\tb= q;\r\n\t\twhile({a!=b and:{i<n}}, {\r\n\t\t\tif(a>b, {\r\n\t\t\t\tres.add(1);\r\n\t\t\t\tb= b+q;\r\n\t\t\t}, {\r\n\t\t\t\tres.add(0);\r\n\t\t\t\ta= a+p;\r\n\t\t\t});\r\n\t\t\tif(a==b and:{i<n}, {\r\n\t\t\t\tres.add(if(t==\\upper, 0, 1));\r\n\t\t\t\ti= i+1;\r\n\t\t\t});\r\n\t\t\ti= i+1;\r\n\t\t});\r\n\t\ti<n;\r\n\t}, {});\r\n\tres;\r\n};\r\n)\r\n\r\n~chsequl.(\\upper, 8, 7, 6).do{|x| x.postln};\r\n~chsequl.(\\upper, 8, 7, 5).do{|x| x.postln};\r\n~chsequl.(\\upper, 8, 3).do{|x| x.postln};\r\n~chsequl.(\\lower, 8, 3).do{|x| x.postln};\r\n~chsequl.(\\lower, 3, 8).do{|x| x.postln};\r\n~chsequl.(\\upper, 3, 8).do{|x| x.postln};\r\n\r\n\r\n//------------------------------------------------------------------------\r\n// cfsqrt\r\n// calculates continued fractions for: sqrt(n)\r\n//------------------------------------------------------------------------\r\n(\r\n~cfsqrt= {|n|\r\n\tvar res= List.new;\r\n\tvar frac= List.new;\r\n\tvar aa= 0, bb= 1, a0= sqrt(n).asInteger;\r\n\tvar a= a0;\r\n\tres.add(a);\r\n\tif(a*a<n, {\r\n\t\twhile({a!=(2*a0)}, {\r\n\t\t\taa= bb*a-aa;\r\n\t\t\tbb= (n-(aa*aa)).div(bb);\r\n\t\t\ta= (a0+aa).div(bb);\r\n\t\t\tfrac.add(a);\r\n\t\t});\r\n\t});\r\n\tres.add(frac);\r\n};\r\n)\r\n\r\n~cfsqrt.(3);\r\n~cfsqrt.(12);\r\n~cfsqrt.(32);\r\n~cfsqrt.(128);\r\n\r\n\r\n//------------------------------------------------------------------------\r\n// cfcv\r\n// calculates a continued fraction convergent\r\n//------------------------------------------------------------------------\r\n(\r\n~cfcv= {|...ai|\r\n\tvar res= List.new;\r\n\tvar p0= 0, p1= 1, q0= 1, q1= 0;\r\n\tvar p2, q2;\r\n\tai.do{|a|\r\n\t\tp2= a*p1+p0;\r\n\t\tq2= a*q1+q0;\r\n\t\tp0= p1;\r\n\t\tp1= p2;\r\n\t\tq0= q1;\r\n\t\tq1= q2;\r\n\t};\r\n\tres.add(p2).add(q2);\r\n};\r\n)\r\n\r\n~cfcv.(1, 1, 2);\r\n~cfcv.(1, 1, 2, 1, 2);\r\n~cfcv.(1, 2, 3, 4);\r\n~cfcv.(1, 2, 3, 4, 5);\r\n\r\n\r\n//------------------------------------------------------------------------\r\n// pfold\r\n// generates fold sequences\r\n//   n= number of terms, 1,3,7,15,31,63,127,...\r\n//   m= number of bits\r\n//   f= function number 0 -> 2^m-1\r\n//------------------------------------------------------------------------\r\n(\r\n~pfold= {|n, m, f|\r\n\tvar res= List.new;\r\n\tvar i= 1, j, k;\r\n\tvar oddeven= {|n, a, b|  //finds a and b such that n= 2^a*(2*b+1)\r\n\t\tvar k= 0, l;\r\n\t\tl= n&(0-n);\r\n\t\tb= (n/l-1).div(2);\r\n\t\twhile({l>1}, {\r\n\t\t\tl= l>>1;\r\n\t\t\tk= k+1;\r\n\t\t});\r\n\t\t[k, b];\r\n\t};\r\n\twhile({i<=n}, {\r\n\t\t#k, j= oddeven.(i, k, j);\r\n\t\tk= k%m;\r\n\t\tb= if(f&(1<<k)>0, 1, 0);\r\n\t\tif((2*j+1)%4>1, {b= 1-b});\r\n\t\tres.add(b);\r\n\t\ti= i+1;\r\n\t});\r\n\tres;\r\n};\r\n)\r\n\r\n~pfold.(15, 4, 1);\r\n~pfold.(31, 5, 0);\r\n~pfold.(3, 4, 5);\r\n~pfold.(4, 5, 6);\r\n\r\n\r\n//------------------------------------------------------------------------\r\n// rndint\r\n// generates random numbers with specified correlation\r\n//   m= range of numbers, 0 to m\r\n//   s= starting number, 0 to m\r\n//   c= degree of correlation\r\n//      0= total correlation (all numbers= s)\r\n//      m= no correlation (each number is independent)\r\n//   n= how many random numbers to generate\r\n//------------------------------------------------------------------------\r\n(\r\n~rndint= {|m, s, c, n|\r\n\tvar res= List.new;\r\n\tvar i= 0, j;\r\n\twhile({i<n}, {\r\n\t\tres.add(s);\r\n\t\tif(c>0, {\r\n\t\t\tj= m;\r\n\t\t\twhile({j>(m-c)}, {\r\n\t\t\t\tk= 1/j;\r\n\t\t\t\tif(1.0.rand<(s*k), {s= s-1});\r\n\t\t\t\tj= j-1;\r\n\t\t\t});\r\n\t\t\tk= 1/2;\r\n\t\t\tj= 0;\r\n\t\t\twhile({j<c}, {\r\n\t\t\t\tif(1.0.rand<k, {s= s+1});\r\n\t\t\t\tj= j+1;\r\n\t\t\t});\r\n\t\t});\r\n\t\ti= i+1;\r\n\t});\r\n\tres;\r\n};\r\n)\r\n\r\n~rndint.(3, 2, 1, 4);\r\n\r\n\r\n//------------------------------------------------------------------------\r\n// markovgen\r\n// generates random numbers using a markov chain\r\n//   mfile= transition matrix file name\r\n//   s= starting state\r\n//   n= how many random numbers to generate\r\n//------------------------------------------------------------------------\r\n(\r\n~table= #[4,\r\n\t0, 1, 0, 0,\r\n\t0, 0, 1, 0,\r\n\t0, 0, 0, 1,\r\n\t1, 0, 0, 0\r\n];\r\n~markovgen= {|m, s, n|\r\n\tvar res= List.new;\r\n\tvar ns= m[0];  //number of states\r\n\tvar pM, mm, u;\r\n\tn.do{|i|\r\n\t\tres.add(s);\r\n\t\tpM= m.drop(1).clump(ns)[s];\r\n\t\tu= 1.0.rand;\r\n\t\tj= 0;\r\n\t\tx= 0.0;\r\n\t\twhile({j<ns}, {\r\n\t\t\tx= x+pM[j];\r\n\t\t\tif(u<x, {s= j; j= ns});\r\n\t\t\tj= j+1;\r\n\t\t});\r\n\t};\r\n\tres;\r\n};\r\n)\r\n\r\n~markovgen.(~table, 0, 8);\r\n~markovgen.(~table, 1, 8);\r\n~markovgen.([2, 0.75, 0.25, 0.25, 0.75], 0, 8);",
   "is_private" : null,
   "id" : "1-57L",
   "author" : "Fredrik Olofsson",
   "name" : "creating rhythms",
   "description" : "from the book 'Creating Rhythms' by Stefan Hollos & J. Richard Hollos\r\nhttp://abrazol.com/books/rhythm1\r\nported from c to supercollider\r\nrelated classes: Bjorklund",
   "ancestor_list" : []
}
