mercury-lang
Version:
Parser for the mercury live coding language
576 lines (475 loc) • 13 kB
Plain Text
// 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!!!