Guest User

Untitled

a guest
Jun 9th, 2018
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 11.05 KB | None | 0 0
  1. import armstrong
  2. import buze
  3. import random
  4. import sys
  5. PATTERN_LENGTH = 1024
  6. seed = random.randint(0, PATTERN_LENGTH / 16 - 1)
  7. # shuffle definitions and produt
  8. base = 125
  9. width = 10
  10. beat_s = (60./(base-width))+(60./(base+width))
  11.  
  12. def dump_errors(player):
  13.   """This prints validation errors. But never seen it produce any """
  14.   errs = player.get_validation_errors()
  15.   n = 0
  16.   while errs.valid():
  17.     err = errs.current()
  18.     print "error %i: %s" % (n, err)
  19.     errs.next()
  20.     n += 1
  21.  
  22. def find_master(player):
  23.   "Finds the first master"
  24.   master = None
  25.   plugit = player.get_plugin_iterator()
  26.   while plugit.valid():
  27.     plugin = plugit.current()
  28.     loader = plugin.get_pluginloader()
  29.     if loader.get_uri() == "@zzub.org/master":
  30.       print "Found master"
  31.       master = plugin
  32.     plugit.next()
  33.     return master
  34.  
  35. def create_generator(player, uri="@trac.zeitherrschaft.org/aldrin/lunar/generator/synth;1", position=None, tracks=3, name=None):
  36.   loader = player.get_pluginloader_by_name(uri)
  37.   if not name:
  38.     name = loader.get_name()
  39.   newplug = player.create_plugin(None, 0, name, loader) # loader.get_name as default name
  40.   if not position:
  41.     position = random.random()*2-1.0, random.random()*2-1.0
  42.   newplug.set_position(position[0], position[1])
  43.   newplug.set_track_count(tracks) # We could use logic to test against max tracks
  44.   return newplug
  45.  
  46. def create_notegen(player, name, generator, uri="@zzub.org/notegen", position=None):
  47.   loader = player.get_pluginloader_by_name(uri)
  48.   noteplug = player.create_plugin(None, 0, name, loader)
  49.   if position:
  50.     noteplug.set_position(position[0], position[1])
  51.   noteplug.set_track_count(generator.get_track_count(2))
  52.   generator.create_note_connection(noteplug)
  53.   return noteplug
  54.  
  55. def set_parameters_from_dump_by_name(player, target_machine, dump):
  56.   plugit = player.get_plugin_iterator()
  57.   done = False
  58.   while plugit.valid():
  59.     plugin = plugit.current()
  60.     if target_machine == plugin.get_name():
  61.       set_parameters_from_dump(player, plugin, dump)
  62.       done = True
  63.     plugit.next()
  64.   if done:
  65.     print "done setting params to %s" % target_machine
  66.   else:
  67.     print "did not find: %s" % target_machine
  68.     print "did nothing."
  69.  
  70.  
  71. def set_parameters_from_dump(player, plugin, dump):
  72.   loader = plugin.get_pluginloader()
  73.   for group_n in range(min(len(dump), 3)):
  74.     group = dump[group_n]
  75.     for track_n in range(min(len(group), plugin.get_track_count(group_n))):
  76.       track = group[track_n]
  77.       for param_n in range(min(len(track), plugin.get_parameter_count(group_n, track_n))):
  78.         value = track[param_n]
  79.         plugin.set_parameter_value(group_n, track_n, param_n, value, 0)
  80.   print "done setting params to %s" % plugin.get_name()
  81.  
  82. # Start!
  83. # Clean up!
  84. app = mainframe.get_application()
  85. doc = mainframe.get_document()
  86. player = doc.get_player()
  87. app.show_wait_window()
  88. app.set_wait_text("Going to generate %i rows: Clearing..." % PATTERN_LENGTH)
  89. doc.clear_song()
  90.  
  91. # Policy for placement
  92. x_policy = lambda x_n: - 1.0 + 2*(1.+x_n) / (2+4) # 4 is hardcoded
  93.  
  94. # master is usually in the default document
  95. master = find_master(player)
  96. print "Master is %r" % master
  97. assert master, "Master not found"
  98.  
  99. x = x_policy(0)
  100. seq = create_generator(player,
  101.   uri="@zzub.org/sequence/sequence",
  102.   position=(x, 0),
  103.   tracks=1)
  104.  
  105. # Create a minisynth and connect it to master
  106. x = x_policy(0)
  107. bassplug = create_generator(player,
  108.   uri="@trac.zeitherrschaft.org/aldrin/lunar/generator/synth;1",
  109.   position=(x, -.5),
  110.   tracks=1)
  111. bassnoteplug = create_notegen(player, "Bass", bassplug, position=(x, -.9))
  112. # Set Lunar Minisynth to a preset nice sound
  113. parameter_dump = [[[0, 0, 255, 255]], [[0, 5863, 8252, 862, 8009, 59, 12, 735, 3923, 0, 617, 0]], [[33, 255], [0, 255], [0, 255], [0, 255]]]
  114. set_parameters_from_dump(player, bassplug, parameter_dump)
  115. master.create_audio_connection(bassplug, 0, 2, 0, 1) # Here we need logic to autoconnect mono -> stereo
  116. # Create a bassdrum
  117. x = x_policy(1)
  118. bdplug = create_generator(player,
  119.   uri="@zzub.org/buzz2zzub/FSM+Kick+XP",
  120.   position=(x, -.5),
  121.   tracks=1)
  122. parameter_dump = [[[0, 0, 255, 255]], [[]], [[255, 128, 115, 16, 5, 16, 50, 28, 41, 97, 13, 1, 240, 205, 255]]]
  123. set_parameters_from_dump(player, bdplug, parameter_dump)
  124. master.create_audio_connection(bdplug, 0, 2, 0, 1) # FSM Kick XP is mono
  125. # Create chord-synth, with echo
  126. x = x_policy(2)
  127. chordplug = create_generator(player,
  128.   uri="@trac.zeitherrschaft.org/aldrin/lunar/generator/synth;1",
  129.   position=(x, -.5),
  130.   tracks=6)
  131. chordnoteplug = create_notegen(player, "Chord", chordplug, position=(x, -.9))
  132. x = x_policy(3)
  133. parameter_dump = [[[0, 0, 255, 255]], [[0, 5810, 5634, 856, 6124, 59, 12, 735, 3923, 0, 617, 0]], [[255, 255], [255, 255], [255, 255], [0, 255]]]
  134. set_parameters_from_dump(player, chordplug, parameter_dump)
  135. echoplug = create_generator(player,
  136.   uri="@oskari/ninja+delay;1",
  137.   position=(x, -.5),
  138.   tracks=1)
  139. echoplug.create_audio_connection(chordplug, 0, 2, 0, 2)
  140. echoplug.set_parameter_value(2, 0, 0, int(beat_s*1000/4.*3), 0) # length
  141. echoplug.set_parameter_value(2, 0, 1, 1, 0) # unit = ms (1)
  142. master.create_audio_connection(chordplug, 0, 2, 0, 1)
  143. master.create_audio_connection(echoplug, 0, 2, 0, 2)
  144. # Create arp-synth, with echo
  145. x = x_policy(1)
  146. arpplug = create_generator(player,
  147.   uri="@trac.zeitherrschaft.org/aldrin/lunar/generator/synth;1",
  148.   position=(x, .5),
  149.   tracks=1)
  150. arpnoteplug = create_notegen(player, "Arp", arpplug, position=(x, .9))
  151. parameter_dump = [[[0, 0, 255, 255]], [[0, 0, 5964, 328, 6124, 96, 34, 3425, 3923, 0, 818, 0]], [[255, 255]]]
  152. set_parameters_from_dump(player, arpplug, parameter_dump)
  153. x = x_policy(2)
  154. echoplug = create_generator(player,
  155.   uri="@oskari/ninja+delay;1",
  156.   position=(x, .5),
  157.   tracks=1)
  158. echoplug.set_parameter_value(2, 0, 0, int(beat_s*1000/2), 0) # length (1,0,1) = 768
  159. echoplug.set_parameter_value(2, 0, 1, 1, 0) # unit (1,0,2) = ms (1)
  160. echoplug.create_audio_connection(arpplug, 0, 2, 0, 2)
  161. master.create_audio_connection(arpplug, 0, 2, 0, 1)
  162. master.create_audio_connection(echoplug, 0, 2, 0, 2)
  163.  
  164. # Create a pattern format
  165. format = player.create_pattern_format("Notes")
  166. idx = 0
  167. # BPM
  168. format.add_column(seq, 1, 0, 0, idx) # Trigger Note
  169. idx += 1
  170. # Bass
  171. generator = bassplug
  172. notegen = bassnoteplug
  173. for track_n in range(generator.get_track_count(2)):
  174.   for n in [0, 2]:
  175.     format.add_column(notegen, 2, track_n, n, idx)
  176.     idx += 1
  177. # Add cut off, group 1, param 7
  178. format.add_column(generator, 1, 0, 7, idx)
  179. column = format.get_column(generator, 1, 0, 7)
  180. column.set_mode(5) # slider
  181. idx += 1
  182. # Chords
  183. generator = chordplug
  184. notegen = chordnoteplug
  185. for track_n in range(generator.get_track_count(2)):
  186.   for n in [0, 2]:
  187.     format.add_column(notegen, 2, track_n, n, idx)
  188.     idx += 1
  189. # Chords cut off
  190. format.add_column(generator, 1, 0, 7, idx)
  191. column = format.get_column(generator, 1, 0, 7)
  192. column.set_mode(5) # slider
  193. idx += 1
  194. # Chords decay
  195. format.add_column(generator, 1, 0, 2, idx)
  196. column = format.get_column(generator, 1, 0, 2)
  197. column.set_mode(5) # slider
  198. idx += 1
  199. # Arp
  200. generator = arpplug
  201. notegen = arpnoteplug
  202. for track_n in range(generator.get_track_count(2)):
  203.   for n in [0, 2]:
  204.     format.add_column(notegen, 2, track_n, n, idx)
  205.     idx += 1
  206. # Arps cut off
  207. format.add_column(generator, 1, 0, 7, idx)
  208. column = format.get_column(generator, 1, 0, 7)
  209. column.set_mode(5) # slider
  210. idx += 1
  211. # Arps decay
  212. format.add_column(generator, 1, 0, 2, idx)
  213. column = format.get_column(generator, 1, 0, 2)
  214. column.set_mode(5) # slider
  215. idx += 1
  216. # Create columns for kick:
  217. format.add_column(bdplug, 2, 0, 0, idx) # Trigger Note
  218. idx += 1
  219. format.add_column(bdplug, 2, 0, 1, idx) # Trigger
  220. idx += 1
  221. # Pattern format is done
  222.  
  223. # Create the pattern
  224. pattern = player.create_pattern(format, "Riff", PATTERN_LENGTH)
  225.  
  226. # Shuffle BPM
  227. for n in range(PATTERN_LENGTH):
  228.   if n % 2:
  229.     bpm = base + width
  230.   else:
  231.     bpm = base - width
  232.   pattern.insert_value(seq.get_id(), 1, 0, 0, n, bpm, 0)
  233. app.set_wait_text("~shuffle~")
  234. # calculate real delay - but you should use multiple timesources. but look at meeeeee......
  235.  
  236. app.set_wait_text(".")
  237. # And insert a bass-line
  238. for n in range(PATTERN_LENGTH/4):
  239.   t = 2+n*4 # omPA
  240.   if n%16>12:
  241.     note = 9
  242.   else:
  243.     note = 0
  244.   #pattern.insert_note(noteplug, t, 17+0x10*0+note, 2) # This is very slow. So use .inser_value instead.
  245.   note = 17+0x10*0+note
  246.   pattern.insert_value(bassnoteplug.get_id(), 2, 0, 0, t, note, 0) # note on
  247.   pattern.insert_value(bassnoteplug.get_id(), 2, 0, 0, t+2, armstrong.zzub_note_value_off, 0) # note off
  248. app.set_wait_text("..")
  249. # Insert filter
  250. for n in range(PATTERN_LENGTH):
  251.   t = n
  252.   pattern.insert_value(bassplug.get_id(), 1, 0, 7, t, (((t*7)^(t<<8))%0x4e16)*3/4,0) # random math
  253. app.set_wait_text("...")
  254. # Insert unz
  255. pattern.insert_value(bdplug.get_id(), 2, 0, 0, 0, 17+0x10, 0)
  256. for n in range(PATTERN_LENGTH/4):
  257.   pattern.insert_value(bdplug.get_id(), 2, 0, 1, n*4+2+(((n>>3)^n)&3), 00+(1<<(n&7))/3, 0) # note "off"
  258.   pattern.insert_value(bdplug.get_id(), 2, 0, 1, n*4, 0x60, 0) # note on
  259. app.set_wait_text("....")
  260. # Set base note for unz to C-2
  261. for n in range(PATTERN_LENGTH/4):
  262.   pattern.insert_value(bdplug.get_id(), 2, 0, 0, 0, 17+0x10, 0)
  263. app.set_wait_text(".....")
  264.  
  265. # Stabbed chords
  266. steps = [0, 3, 7, 11, 14]
  267. length = 16
  268. n = 0
  269. while True:
  270.   if t > PATTERN_LENGTH-1:
  271.     break
  272.   if n%48>36:
  273.     notes = [17+0x10, 17+0x20+4, 17+0x20+10] # C-2, Eb3, Ab3
  274.   else:
  275.     notes = [17+0x10, 17+0x20+4, 17+0x20+9] # C-2, Eb3, A-3
  276.  
  277.   t = int(n/len(steps))*length+steps[n % len(steps)]
  278.   for track, note in enumerate(notes):
  279.     pattern.insert_value(chordnoteplug.get_id(), 2, track, 0, t, note, 0)
  280.     pattern.insert_value(chordnoteplug.get_id(), 2, track, 0, t+1, armstrong.zzub_note_value_off, 0) # note off
  281.   n += 1
  282. app.set_wait_text("......")
  283. # Chords Cutoff & Decay
  284. for n in range(PATTERN_LENGTH):
  285.   t = n
  286.   pattern.insert_value(chordplug.get_id(), 1, 0, 7, t, ((((t*19)<<7)|((t*7)*3))%0x4e16)/2,0) # random math
  287.   pattern.insert_value(chordplug.get_id(), 1, 0, 2, t, ((((t*17)<<9)|((t*3)*5))%0x2e16)/2+0x200+0x800*n/PATTERN_LENGTH,0) # random math
  288. app.set_wait_text(".......")
  289. # Arp
  290. track_n = 0
  291. for n in range(PATTERN_LENGTH):
  292.   if n%48>36:
  293.     notes = [0, 4, 10, 7 ] # C-2, Eb3, Ab3
  294.   else:
  295.     notes = [0, 4, 9, 5 ] # C-2, Eb3, A-3
  296.   note = notes[n % len(notes)]
  297.   t = n
  298.   #pattern.insert_note(noteplug, t, 17+0x10*0+note, 2) # This is very slow. So use .inser_value instead.
  299.   note = 17+0x10*((n^(n>>4)) % 5)+note
  300.   pattern.insert_value(arpnoteplug.get_id(), 2, 0, 0, t, note, 0) # note on
  301.   pattern.insert_value(arpplug.get_id(), 1, 0, 7, t, (((t<<7)|(8*t*t))%0x4e16)/2, 0)
  302.   scalar = (t*4)%PATTERN_LENGTH
  303.   pattern.insert_value(arpplug.get_id(), 1, 0, 2, t, ((((t<<8)|(8*t*t))%0xA00)*scalar/PATTERN_LENGTH)+0x1200, 0)
  304. app.set_wait_text("........")
  305.  
  306. # Loop and tidy
  307. pattern.set_loop_start(0)
  308. pattern.set_loop_end(PATTERN_LENGTH)
  309. pattern.set_loop_enabled(1)
  310. player.set_order_length(1)
  311. player.set_order_pattern(0, pattern)
  312. player.history_commit(0, 0, "Commit the song")
  313. app.hide_wait_window(0)
  314. print "Done!"
Add Comment
Please, Sign In to add comment