UNPKG

mercury-lang

Version:

Parser for the mercury live coding language

576 lines (475 loc) 13 kB
// set debug 0 // possible arrays and datatypes with arbitrary spaces ring ar1 [0 12 3.14 56 789] print ar1 ring ar2 [11 22 33 44 55] print ar2 ring ar3 [hat kick 3.14 123] print ar3 ring ar4 [0 5 7 9] print ar4 ring ar5 [0 12 24 -12] print ar5 ring arr2d [0[1 2] 3] print arr2d ring ar6 [0 [ 1 2 ] 3 [ 4 5 6] 7] print ar6 ring arr2d2 [hat [kick snare] 1.23 [4 5 [6 7] ]8 9] print arr2d2 // ring ar8 (0 (1 3)2 5(6 7 8 ) ) // print ar8 ring spr1 spread(5 0 12) print spr1 // => [0 2 4 7 9] ring spr2 spreadFloat(5 -1 1) print spr2 // => [-1 -0.6 -0.2 0.2 0.6] ring spr3 spreadF(5 0 2) print spr3 // => [0 0.4 0.8 1.2 1.6] ring spr4 spread(5 12 0) print spr4 // => [9 7 4 2 0] ring spi1 spreadInclusive(5 0 12) print spi1 // => [0 3 6 9 12] ring spi2 spreadInclusiveFloat(5 -1 1) print spi2 // => [-1 -0.5 0 0.5 1] ring spi3 spreadInclusiveF(5 0 2) print spi3 // => [0 0.5 1 1.5 2] ring spi4 spreadInclusive(5 12 0) print spi4 // => [12 9 6 3 0] ring spe1 spreadExp(10 0 10 2) //=> [ 0, 0, 0, 0, 1, 2, 3, 4, 6, 8 ] ring spe3 spreadExpF(10 0 1 2) ring spe2 spreadIncExp(10 0 10 2) //=> [ 0, 0, 0, 1, 1, 3, 4, 6, 7, 10 ] ring fll1 fill(10 2 15 3 20 4) print fll1 // => [10 10 15 15 15 20 20 20 20] ring fll2 fill(kick_min 2 hat_min 3) print fll2 // => [kick_min kick_min hat_min hat_min hat_min] // list fll3 fill([10 20 2 15 3 20 4]) // not supported yet! list fll4 fill([10 20] 2 [30 40] 3 50 4) ring sin1 sine(10) print sin1 // => [6 9 11 11 9 6 2 0 0 2] ring sin2 sine(10 1 -12 12) print sin2 // => [0 7 11 11 7 0 -7 -11 -11 -7] ring sin3 sine(10 2 0 5) print sin3 // => [2 4 3 1 0 2 4 3 1 0] ring sin4 sineFloat(8) print sin4 // => [0 0.707 1 0.707 0 -0.707 -1 -0.707] ring sin5 sineF(12 3 -1 1) print sin5 // => [0 1 0 -1 0 1 0 -1 0 1 0 -1] ring cos1 cosine(10) print cos1 // => [12 10 7 4 1 0 1 4 7 10] ring cos2 cosine(10 1 -12 12) print cos2 // => [12 9 3 -3 -9 -12 -9 -3 3 9] ring cos3 cosine(10 2 0 5) print cos3 // => [5 3 0 0 3 4 3 0 0 3] ring cos4 cosineFloat(8) print cos4 // => [1 0.707 0 -0.707 -1 -0.707 0 0.707] ring cos5 cosineF(12 3 -1 1) print cos5 // => [1 0 -1 0 1 0 -1 0 1 0 -1 0] ring cos6 cosF(30 sinF(30 2) -5 5) list saw1 saw(16 8.5) // => [ 0 6 0 7 1 7 2 8 3 9 3 10 4 10 5 11 ] list saw2 sawF(25 2.5) list sqr1 square(15 4 0 1 0.2) // => [ 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 ] ring euc1 euclidean() print euc1 // => [1 0 1 0 1 0 1 0] ring euc2 euclid(7 5) print euc2 // => [1 1 0 1 1 0 1] // => [1 0 1 1 0 1 1] ring euc3 euclid(7 5 2) print euc3 //=> [0 1 1 1 0 1 1] //=> [1 1 1 0 1 1 0] ring hex1 hexBeat() print hex1 // => [1 0 0 0] ring hex2 hex(a) print hex2 // => [1 0 1 0] ring hex3 hex(f9cb) print hex3 // => [1 1 1 1 1 0 0 1 1 1 0 0 1 0 1 1] ring fib1 fibonacci(10) print fib1 // => [0 1 1 2 3 5 8 13 21 34] ring fib2 fibonacci(3 10) print fib2 // => [55 89 144] ring psn1 pisano() print psn1 // => [0 1 1 2 3 5 8 1 9 10 7 5 0 5 5 10 3 1 4 5 9 2 11 1] ring psn2 pisano(3) print psn2 // => [0 1 1 2 0 2 2 1] ring psn3 pisano(11) print psn3 // => [0 1 1 2 3 5 8 2 10 1] ring psn4 pisano(1) print psn4 // => [0] ring pll1 pell(8) print pll1 // => [0 1 2 5 12 29 70 169] ring luc1 lucas(8) print luc1 // => [2 1 3 4 7 11 18 29] ring tfi1 threeFibonacci(8) print tfi1 // => [0 1 3 10 33 109 360 1189] // Values have changed because seed is now parsed as Number instead of String() set randomSeed '31415' ring rnd1 random(5) print rnd1 // => [1 0 0 1 1] ring rnd2 random(5 12) print rnd2 // => [0 10 3 2 2] ring rnd3 rand(5 -12 12) print rnd3 // => [-2 -5 -8 -11 6] set randomSeed '31415' ring rnf1 randomFloat(5) print rnf1 // => [0.81 0.32 0.01 0.85 0.88] ring rnf2 randomF(5 0 12) print rnf2 // => [0.16 10.72 3.16 262 2.34] ring rnf3 randF(5 -12 12) print rnf3 // => [-1.19 -4.21 -7.36 -10.31 6.82] set randomSeed '1618' ring urn1 urn(5) print urn1 // => [3 7 10 0 2] ring urn2 urn(8 4) print urn2 // => [0 2 1 3 1 3 0 2] ring urn3 urn(8 10 14) print urn3 // => [13 10 12 11 12 10 13 11] set randomSeed '271828' ring coin1 coin(8) print coin1 // => [1 0 1 0 1 0 1 1] ring dice1 dice(8) print dice1 // => [5 4 6 4 4 5 4 2] set randomSeed '271828' ring twv1 twelveTone() print twv1 // => [10 7 6 3 2 9 8 4 1 5 0 11] set randomSeed '62832' ring samples [hat snare kick] ring chs1 choose(10 samples) print chs1 // => [hat kick hat kick hat snare kick hat hat hat] ring notes [0 3 7 5 9 12] ring chs2 choose(10 notes) print chs2 // => [0 5 3 9 0 7 3 12 3 7] set randomSeed '62832' ring samples [hat snare kick tom] ring pck1 pick(10 samples) print pck1 // => [hat kick tom snare tom hat snare kick tom hat] ring notes [0 3 7 5 9 12] ring pck2 pick(10 notes) print pck2 // => [3 0 7 9 12 5 0 7 12 9] set randomSeed '14142' ring samples [hat snare kick tom] ring shf1 shuffle(samples) print shf1 // => [snare tom kick hat] ring notes [0 3 7 5 9 12] ring shf2 scramble(notes) print shf2 // => [12 0 3 7 5 9] set randomSeed 7482 list clv1 clave(8) // => [1 0 1 0 1 0 0 1], list clv2 clave(16 4) // => [1 0 0 1 0 0 1 0 1 0 0 0 1 0 1 0], list clv3 clave(11 3 1) // => [1 0 0 1 0 0 1 0 0 1 1] set randomSeed 3141 list exp4 expand([0 9 7 3 5 0 -1] 12) // => [ 0 9 7 3 5 0 -1 -3 -1 8 3 2 ], set randomSeed 6181 list exp5 expand([0 9 7 3 5 0 -1] 12) // => [ 0 9 7 3 5 0 -1 -2 0 -5 -9 -11 ], ring notes [0 3 7] ring cln1 clone(notes 0 12 7 -7) print cln1 // => [0 3 7 12 15 19 7 10 14 -7 -4 0] ring chrd [[0 3 7] 0] ring cln2 clone(chrd 0 10 20 -10) // [[ 0, 3, 7 ], 0, [ 10, 13, 17 ], 10, [ 20, 23, 27 ], 20, [ -10, -7, -3 ] -10] ring chrd2 [[c e] [g b] d] ring cln3 clone(chrd2 4 5) // [[ 'c4', 'e4' ],[ 'g4', 'b4' ],'d4',[ 'c5', 'e5' ],[ 'g5', 'b5' ],'d5'] ring partA [[0 3] 7] ring partB [24 [19] 12] ring partC [-7 [-5 [-3]]] ring cmb1 combine(partA partB partC) print cmb1 // => [ [ 0, 3 ], 7, 24, [ 19 ], 12, -7, [ -5, [ -3 ] ] ] ring partC [kick hat snare hat] ring partD [hat [hat hat snare]] ring jn1 join(partC partD) print jn1 // => [ 'kick', 'hat', 'snare', 'hat', 'hat', [ 'hat', 'hat', 'snare' ] ] // concat() ring notes [0 [3 7] 9] ring dup1 duplicate(notes 3) print dup1 // => [ 0, [ 3, 7 ], 9, 0, [ 3, 7 ], 9, 0, [ 3, 7 ], 9 ] // dup() list pad1 [3 7 11 12] list pad2 pad(pad1 9) // [ 3, 7, 11, 12, 0, 0, 0, 0, 0] list pad3 pad([c f g] 11 - 4) // [ '-', '-', '-', '-', 'c', 'f', 'g', '-', '-', '-', '-' ] ring rhythm [1 0 1 1 0 1 1] ring evr1 every(rhythm 2 8) print evr1 // => [1 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0] ring melody [5 7 3 9 1] ring evr2 every(melody 2 7 12) print evr2 // => [5 7 3 9 1 12 12 12 12 12 12 12 12 12] ring rhythm [1 1 0 1 1] ring evr3 every(rhythm 2 8 0 1) print evr3 // => [0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0] list evr4 every([c4 eb4 g4 f4 eb4] 2 8 r) print evr4 //=> [ 'c4', 'eb4', 'g4', 'f4', // 'eb4', 'r', 'r', 'r', // 'r', 'r', 'r', 'r', // 'r', 'r', 'r', 'r' ] list fln1 flat([0 [1 2 [3 4] 5 [6 [7]]]]) print fln1 // [ 0, 1, 2, 3, 4, 5, 6, 7] list fln2 flat([0 [1 2 [3 4] 5 [6 [7]]]] 1) print fln2 // [ 0, 1, 2, [ 3, 4 ], 5, [ 6, [ 7 ] ] ] ring notes [0 3 7 12] ring inv1 invert(notes) print inv1 // => [12 9 5 0] ring inv2 invert(notes 5) print inv2 // => [10 7 3 -2] ring inv3 invert(notes 3 10) print inv3 // => [13 10 6 1] list inv4 invert([0 [3 [7 12]]] 3 10) print inv4 // => [ 13 [ 10 [ 6 1 ] ] ] // inverse() // flip() // inv() ring notes [0 7 7 5 3 12 0 3 3] ring flt1 filter(notes 3) print flt1 ring flt2 filter(notes 7 5 12) print flt2 ring flt3 filter([0 [7 7 5] 3 [12 0 3] 3] 3) print flt3 // [ 0, [ 7, 7, 5 ], [ 12, 0, 3 ] ] ring partA [0 3 7 5 0] ring partB [12 19 15] ring partC [24 22] ring lc2 lace(partA partB partC) print lc2 // => [0 12 24 3 19 22 7 15 5 0] // zip() // works with multidimensional arrays list lc2 lace([0 [0 0]] [[7 7]] [9 [9 9] 9]) //=> [ 0, [ 7, 7 ], 9, [ 0, 0 ], [ 9, 9 ], 9 ] ring partA [0 3 7 5 0] ring partB [12 19 15] ring merged merge(partA partB) print merged // => [[0 12] [3 19] [7 15] 5 0] // mix() list mrg2 merge([[c4 e4] c4] [[f4 a4]] [g4 g4]) print mrg2 //=> [ [ 'c4', 'e4', 'f4', 'a4', 'g4' ], [ 'c4', 'g4' ] ] list lk1 lookup([0 1 1 2 0 2 2 1] [c4 e4 f4 g4]) //=> [ 'c4', 'e4', 'e4', 'f4', 'c4', 'f4', 'f4', 'e4' ] list lk2 lookup([0 [1 1 [2 3] 0] 2] [c4 e4 f4 g4]) //=> [ 'c4', [ 'e4', 'e4', [ 'f4', 'g4' ], 'c4' ], 'f4' ] set randomSeed 8729 list lk3 lookup(random(8) [c4 e4 f4 g4]) // [ 'e4', 'c4', 'c4', 'c4', 'c4', 'c4', 'e4', 'c4' ] ring notes [0 [3 7] 12] ring pln1 palindrome(notes) print pln1 // [ 0, [ 3, 7 ], 12, 12, [ 3, 7 ], 0 ] ring pln2 palindrome(notes 1) print pln2 // [ 0, [ 3, 7 ], 12, [ 3, 7 ] ] // palin() // mirror() ring melody [0 3 7 5 7 9 12] ring left rotate(melody -2) print left // => [7 5 7 9 12 0 3] ring right rotate(melody 2) print right // => [9 12 0 3 7 5 7] // rotate() // turn() // rot() ring melody [0 3 7 5] ring rev reverse(melody) print rev // => [5 7 3 0] // retrograde() // // rev() ring notes [0 3 7] ring phrase repeat(notes 4) // => [0 0 0 0 3 3 3 3 7 7 7 7] ring notes [[0 3] 7] ring rpt1 repeat(notes 4) // => [[[ 0, 3 ], [ 0, 3 ],[ 0, 3 ], [ 0, 3 ], 7, 7, 7, 7] print rpt1 ring repeats [2 5 3] ring phraseB repeat(notes repeats) // => [0 0 3 3 3 3 3 7 7 7] print phraseB // also works with strings ring samples [kick snare hat] ring beats repeat(samples repeats) // => [kick kick snare snare snare snare hat hat hat] print beats set randomSeed 4837 ring notes random(12 0 12) ring srt1 sort(notes) print srt1 // => [2 2 3 3 5 6 6 6 7 9 10 11] ring srt2 sort(notes -1) print srt2 // => [11 10 9 7 6 6 6 5 3 3 2 2] ring notes [12 19 15 17] ring places [1 0 0 1 1 0 1 0 1 0] ring sprayed spray(notes places) print sprayed // => [12 0 0 19 15 0 17 0 12 0] list slc1 slice(spread(8) [3 2]) //=> [ [ 0, 1, 2 ], [ 3, 4 ], [ 5, 6, 7 ] ] list slc2 slice(spread(24) [3 2 -1 5] 0) //=> [ [ 0, 1, 2 ], [ 3, 4 ], [ 5, 6, 7, 8, 9 ] ] list spl1 split(spread(12) 3) //=> [ [ 0, 1, 2 ], [ 3, 4, 5 ], [ 6, 7, 8 ], [ 9, 10, 11 ] ] list spl2 split(spread(12) [3 2 -1]) //=> [ [ 0, 1, 2 ], [ 3, 4 ], [ 5, 6, 7 ], [ 8, 9 ], [ 10, 11 ] ] list ct cut(spread(8) 3) //=> [ 0, 1, 2 ] ring notes [0 5 7 3 7 7 0 12 5] ring thinned unique(notes) print thinned ring nts [0 12 5 7] ring str stretch(nts 50) print str ring strF stretchFloat(nts 50) print strF set randomSeed 3141 ring nts [0 9 7 3 5 0 -1] ring exp expand(nts 30) print exp set randomSeed 1618 ring exp2 expand(nts 30) print exp2 // => [0 5 7 3 12] // thin() list mtn3 midiToNote([60 [63 67 69] [57 65]]) //=> [ 'c4', [ 'eb4', 'g4', 'a4' ], [ 'a3', 'f4' ] ] list mtf1 midiToFreq([60 [63 67 69] [57 65]]) //=> [ 261.63, [ 311.13, 391.995, 440 ], [ 220, 349.23 ] ] list ntm1 noteToMidi([c4 [eb4 g4 a4] [a3 f4]]) //=> [ 60, [ 63, 67, 69 ], [ 57, 65 ] ] list ntf1 noteToFreq([c4 [eb4 g4 a4] [a3 f4]]) //=> [ 261.63, [ 311.13, 391.995, 440 ], [ 220, 349.23 ] ] list ftm1 freqToMidi([261 [311 391 440] [220 349]]) //=> [ 60, [ 63, 67, 69 ], [ 57, 65 ] ] // with detuning floating point midi for pitch bend list ftm2 freqToMidi([261 [311 391 440] [220 349]] 1) //=> [ 59.959, [ 62.993, 66.956, 69 ], [ 57, 64.989 ]] list ftn1 freqToNote([261 [311 391 440] [220 349]]) //=> [ 'c4', [ 'eb4', 'g4', 'a4' ], [ 'a3', 'f4' ] ] list rtm1 relativeToMidi([[-12 -9 -5] [0 4 7] [2 5 9]] c4) //=> [ [ 48, 51, 55 ], [ 60, 64, 67 ], [ 62, 65, 69 ] ] list rtm2 relativeToFreq([[-12 -9 -5] [0 4 7] [2 5 9]] c4) //=> [[130.81, 155.56, 196 ], [ 261.62, 329.63, 392 ], [ 293.66, 349.23, 440]] list rtc1 ratioToCent([2/1 [3/2 [4/3 5/4]] 9/8]) //=> [ 1200, [ 701.95, [ 498.04, 386.31 ] ], 203.91 ] set tempo 120 ring divs [1/4 [1/8 [3/16 1/4]] 1/6 2] ring ms1 dtoms(divs) print ms1 //=> [ 500, [ 250, [ 375, 500 ] ], 333.33, 4000 ] ring ms2 dtoms(divs 100) print ms2 //=> [ 600, [ 300, [ 450, 600 ] ], 400, 4800 ] ring ratios [0.25 [0.125 [0.1875 0.25]] 0.1667 2] ring ms3 dtoms(ratios 100) print ms3 //=> [ 600, [ 300, [ 450, 600 ] ], 400.08, 4800 ] list comb [1/4 [0.125 [3/15 0.25]] 1/6 2] list ms4 dtoms(comb 100) //=> [ 600, [ 300, [ 450, 600 ] ], 400, 4800 ] list tv1 ttor(['4n' ['8nt' ['16nd' '2nd']] '32n' '3m']) //=> [ 0.25, [ 0.08333333333333333, [ 0.09375, 0.75 ] ], 0.03125, 3 ] list tv2 ttor(['4n' ['8nt' ['16nd' '2nd']] '32n' '3m'] 100) // list tv2 t2r(['4n' ['8nt' ['16nd' '2nd']] '32n' '3m'] 100) //=> [ 600, [ 200, [ 225, 1800 ] ], 75, 7200 ] list wr1 wrap([0 [1 [2 3]] [4 5] 6] 2 5) //=> [ 3, [ 4, [ 2, 3 ] ], [ 4, 2 ], 3 ] list ct1 clip([0 [1 [2 3]] [4 5] 6] 2 5) //=> [ 2, [ 2, [ 2, 3 ] ], [ 4, 5 ], 5 ] list fl1 fold([0 [1 [2 3]] [4 5] 6] 2 5) //=> [ 4, [ 3, [ 2, 3 ] ], [ 4, 5 ], 4 ] list sc1 map([0 [1 [2 3]] 4] 0 4 -1 1) //=> [ -1, [ -0.5, [ 0, 0.5 ] ], 1 ] list arm1 add([1 [2 3]] [10 [20 30 40]]) //=> [ 11, [ 22, 33, 42 ] ] list arm2 sub([1 [2 3]] [10 [20 30 40]]) //=> [ -9, [ -18, -27, -38 ] ] list arm3 mul([1 [2 3]] [10 [20 30 40]]) //=> [ 10, [ 40, 90, 80 ] ] list arm4 div([1 [2 3]] [10 [20 30 40]]) //=> [ 0.1, [ 0.1, 0.1, 0.05 ] ] // add() // subtract() // sub() // multiply() // mul() // divide() // div() print DONE!!!