Advertisement
Guest User

Untitled

a guest
Aug 25th, 2019
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.63 KB | None | 0 0
  1. math.randomseed(os.time())
  2.  
  3. --output random # between 0 and 1
  4. function random()
  5. local big = 10000000
  6. return math.random(0,big)/big
  7. end
  8.  
  9. --object representing a single note
  10. Note = {
  11. order = 0; note = " ";
  12.  
  13. new = function(order, note)
  14. local n = {}
  15. n.order = order
  16. n.note = note
  17. n.get = Note.get
  18. return n
  19. end;
  20.  
  21. get = function(self)
  22. print(self.order, self.note)
  23. end
  24. }
  25.  
  26. --object containing list of notes, contains all 12 notes by default
  27. NoteList = {
  28. Note.new(1, 'Ab');
  29. Note.new(2, 'A');
  30. Note.new(3, 'Bb');
  31. Note.new(4, 'B');
  32. Note.new(5, 'C');
  33. Note.new(6, 'Db');
  34. Note.new(7, 'D');
  35. Note.new(8, 'Eb');
  36. Note.new(9, 'E');
  37. Note.new(10, 'F');
  38. Note.new(11, 'Gb');
  39. Note.new(12, 'G');
  40.  
  41. get = function(self)
  42. for i=1,#self do
  43. self[i]:get()
  44. end
  45. end;
  46.  
  47. new = function(self)
  48. local n = {}
  49. for k,v in pairs(NoteList) do
  50. n[k] = v
  51. end
  52. return n
  53. end;
  54.  
  55. --randomly select N notes from default NoteList, retaining original sort order
  56. randomlist = function(self, N)
  57. local copy = NoteList.new()
  58.  
  59. --shuffle the note list by assigning random # and sorting by it
  60. for k,v in ipairs(copy) do
  61. copy[k].random = random()
  62. end
  63. table.sort(copy, function(k1, k2) return k1.random < k2.random end)
  64.  
  65. --delete all but first N notes
  66. for i=#copy, 1, -1 do
  67. if i > N then
  68. copy[i] = nil
  69. end
  70. end
  71.  
  72. --sort back into original order (by note name) and output
  73. table.sort(copy, function(k1, k2) return k1.order < k2.order end)
  74. return copy
  75. end;
  76.  
  77. --output space-separated list of notes from object
  78. output_list = function(self)
  79. local output = ""
  80. for k,v in ipairs(self) do
  81. if k==1 then output = self[k].note
  82. else output = output .. " " .. self[k].note
  83. end
  84. end
  85. return output
  86. end
  87. }
  88.  
  89. --generate [num] note lists each containing between [min] and [max] total notes
  90. function generate_lists(num, min, max)
  91. for i=1,num do
  92. n = math.random(min, max)
  93. local a = NoteList:randomlist(n)
  94. print(a:output_list())
  95. end
  96. end
  97.  
  98. generate_lists(50, 2, 5)
  99.  
  100. --[[
  101. sample output:
  102. Bb F Gb
  103. Ab D E F G
  104. A Eb F
  105. Gb G
  106. B D E Gb
  107. Bb Db
  108. Bb D
  109. Ab C D E
  110. B C Db Eb E
  111. Db D E Gb G
  112. A D Eb
  113. Eb E
  114. D G
  115. A Eb Gb
  116. B Eb E
  117. B D
  118. F Gb
  119. Ab Bb F Gb
  120. B F Gb
  121. C Db Eb Gb
  122. Bb C
  123. Gb G
  124. Ab A D E Gb
  125. C Db Gb
  126. A Bb Db F
  127. Ab Bb B G
  128. B D
  129. Db G
  130. Bb B E F
  131. Ab D E Gb
  132. Db Gb G
  133. Db Gb
  134. Ab C D F Gb
  135. Ab E
  136. A Db Gb
  137. Bb Db Eb Gb
  138. A G
  139. A Bb D Eb G
  140. Db F
  141. B D Gb
  142. B D E
  143. C D Eb F G
  144. B F Gb G
  145. B C D G
  146. C Db
  147. A Gb
  148. B Eb E Gb
  149. Bb Db Gb
  150. Ab C E G
  151. Bb B D G
  152. --]]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement